📜  Java8 Stream API(1)

📅  最后修改于: 2023-12-03 15:31:35.475000             🧑  作者: Mango

Java8 Stream API介绍

Java8 Stream API是Java8新引入的一种处理集合数据的方式,它提供了强大的功能,使得我们能够以一种声明式的方式来操作集合数据并完成相关的处理。它可以处理大量的数据,而无需使用for循环或者其他迭代方式,同时也提供了并行处理的能力,从而保证了高效率的数据处理。

Stream基本概念
  • Stream:一个Java8中用于处理集合数据的抽象流,它并不是集合本身,而是对集合操作的一个流程,它本身并不存储数据,而是从数据源中获取数据并进行处理,最终得到处理后的结果。
  • 数据源:Stream操作的源,可以是一个集合,一个数组,一个I/O channel以及其他的支持数据汇聚操作的数据源。
  • 中间操作:中间操作是一个Stream上的操作,它返回另一个Stream作为其结果,可以链式调用多个中间操作。
  • 终止操作(或者称为终端操作):终止操作是一个Stream上的一个最终操作,当执行终止操作时,Stream会生成一个结果或者副作用,比如List或者int型的总和。
Stream主要特点
  • 声明式:Stream API 可以通过声明式的方式来处理数据,而不是过程式的方式。这就好像在SQL 中使用对数据进行查询一样,而不必去关心如何实现它。
  • 可以并行处理:Stream可以以某种顺序进行并行处理,在多核CPU上处理大量的数据时,因为其优化,它会比使用循环或者迭代的方式更为高效。
  • Stream流封闭:Stream 不改变原数据源的内容。Stream操作只是从一个操作转移到另一个操作而已,不会改变原先的数据源的内容。
Stream常见中间操作

我们只列出常见的几个中间操作。

map
<R> Stream<R> map(Function<? super T, ? extends R> mapper)

对Stream中的每个元素应用函数mapper,返回一个新的Stream。
示例代码:

List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> squareNums = nums.stream()
                                .map(n -> n * n)
                                .collect(Collectors.toList());
filter
Stream<T> filter(Predicate<? super T> predicate)

对Stream中的每个元素应用一定的谓词条件,返回一个仅包含符合条件的元素的新Stream。
示例代码:

List<String> strings = Arrays.asList("abc", "", "bcd", "", "defg", "jk");
long count = strings.stream()
                    .filter(str -> str.length() == 3)
                    .count();
sorted
Stream<T> sorted([Comparator<? Super T> comparator])

返回一个根据指定的Comparator排序后的新Stream。
示例代码:

List<Integer> nums = Arrays.asList(5, 1, 3, 2, 4);
List<Integer> sortedNums = nums.stream()
                                .sorted()
                                .collect(Collectors.toList());
distinct
Stream<T> distinct()

返回一个新的Stream,其中包含排重过后的相同元素集合。
示例代码:

List<Integer> nums = Arrays.asList(1, 2, 1, 3, 3, 2, 4);
List<Integer> distinctNums = nums.stream()
                                    .distinct()
                                    .collect(Collectors.toList());
Stream常见终止操作

我们只列出常见的几个终止操作。

forEach
void forEach(Consumer<? super T> action)

对Stream中的每个元素执行给定的操作,该操作不返回任何结果。
示例代码:

List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5);
nums.stream().forEach(n -> System.out.print(n + " "));
count
long count()

返回Stream中元素的个数。
示例代码:

List<String> strings = Arrays.asList("abc", "", "bcd", "", "defg", "jk");
long count = strings.stream()
                    .filter(str -> str.length() == 3)
                    .count();
collect
<R> R collect(Collector<? super T, A, R> collector)

对Stream中的所有元素执行给定的操作,该操作将元素收集到给定类型的结果中。
示例代码:

List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> collect = nums.stream()
                            .filter(n -> n % 2 == 0)
                            .collect(Collectors.toList());
总结

Java8 Stream API是一个强大的操作集合数据的工具,它使用声明式的方式来处理数据,并支持并行处理。使用Stream操作,可以让代码更加简洁,同时也可以提升执行效率。 熟练掌握这些常见的中间操作和终止操作,对提高我们的编程效率很有帮助。