在Java 8中,Stream提供了多种操作,用于以声明式方式处理数据集合。Stream操作分成两种:中间操作和终端操作。中间操作例如filter()
、map()
、sorted()
等用于设置数据流水线,并返回一个新的流,以便可以连接更多的方法调用。终端操作例如forEach()
、collect()
、reduce()
等,用于产生结果或副作用。中间操作中,flatMap()
方法是特别重要的,它可以将多个Stream合成一个Stream,经常用于处理流中的流。
一、中间操作
FILTER
filter
方法用于在流中筛选元素,使用一个Predicate
函数式接口作为参数,该接口接收一个元素,并返回一个布尔值。
List<String> myList = Arrays.asList("apple", "banana", "cherry");
myList.stream()
.filter(s -> s.startsWith("a"))
.forEach(System.out::println); // 输出 apple
MAP
map
方法用来将流中的每个元素映射成另一个对象。
myList.stream()
.map(String::toUpperCase)
.forEach(System.out::println); // 输出 APPLE, BANANA, CHERRY
二、终端操作
FOREACH
forEach
是一个终端操作,用来迭代流中的每个数据元素,通常用来对数据进行操作或直接输出。
myList.stream()
.forEach(System.out::println); // 输出 apple, banana, cherry
COLLECT
collect
是一个较为复杂的终端操作,它接收一个Collector
实例,用来将流中的元素转换成不同类型的结果,如列表、集合或者其他聚合类型。
List<String> filteredList = myList.stream()
.filter(s -> s.contAIns("a"))
.collect(Collectors.toList());
System.out.println(filteredList); // 输出 [apple, banana]
REDUCE
reduce
方法用于通过特定的运算来将所有元素汇总成一个元素,通常用在求和、求乘积或求最大值和最小值的场景中。
Optional<String> concatenatedString = myList.stream()
.reduce((s1, s2) -> s1 + "#" + s2);
concatenatedString.ifPresent(System.out::println); // 输出 apple#banana#cherry
三、其他常用方法
SORTED
sorted
方法用于对流中的元素进行排序。
myList.stream()
.sorted()
.forEach(System.out::println); // 输出 apple, banana, cherry
LIMIT
limit
方法用于截取流中的前N个元素。
myList.stream()
.limit(2)
.forEach(System.out::println); // 输出 apple, banana
SKIP
skip
方法与limit
相反,它用于跳过前N个元素。
myList.stream()
.skip(1)
.forEach(System.out::println); // 输出 banana, cherry
四、匹配和统计
ANYMATCH
anyMatch
方法用于检查流中是否至少有一个元素匹配给定的Predicate
。
boolean hasC = myList.stream()
.anyMatch(s -> s.startsWith("c"));
System.out.println(hasC); // 输出 true
COUNT
count
方法用于计算流中元素的数量。
long count = myList.stream()
.filter(s -> s.startsWith("b"))
.count();
System.out.println(count); // 输出 1
Java 8 的 Stream API极大地简化了集合操作的编程工作。它提供了一种高效且易于使用的处理数据的方式,它的方法丰富且功能强大,开发者可以通过组合使用它们来创建复杂的数据处理管道。尤其在处理大数据集时,Stream操作提供了一种优雅且直观的解决方案。通过串行流或并行流的方式,可以有效地利用多核处理器的能力,以及优化算法的性能。无论是进行简单的数据筛选、转换、还是复杂的分组、聚合等操作,Stream API均能大放异彩。
相关问答FAQs:
Q: 在 Java8 中,Stream 有哪些常用的方法可以使用?
A: Java8 中的 Stream 类提供了丰富的方法,用于操作集合或数组中的元素。以下是一些常用的 Stream 方法:
-
filter() 方法根据给定的条件过滤出符合条件的元素,并返回一个新的 Stream。例如,可以使用 filter() 方法过滤出所有大于 10 的数字。
-
map() 方法通过将元素应用于给定的函数来将 Stream 中的元素转换为另一种类型。例如,可以使用 map() 方法将所有字符串转换为大写。
-
distinct() 方法用于去除 Stream 中的重复元素,并返回一个新的 Stream。例如,可以使用 distinct() 方法去除重复的字符串。
-
sorted() 方法将 Stream 中的元素进行排序,并返回一个新的 Stream。可以通过提供自定义的 Comparator 来指定排序规则。例如,可以使用 sorted() 方法按照数字的大小对元素进行排序。
-
limit() 方法用于限制 Stream 的大小,只返回指定数量的元素,并返回一个新的 Stream。例如,可以使用 limit() 方法只返回前 5 个元素。
-
skip() 方法将忽略 Stream 中的指定数量的元素,并返回一个新的 Stream。例如,可以使用 skip() 方法跳过前 3 个元素。
-
collect() 方法将 Stream 中的元素收集到一个集合中。可以通过提供自定义的 Collector 来指定收集规则。例如,可以使用 collect() 方法将 Stream 中的元素收集到一个列表中。
这些只是 Stream 类提供的一些常用方法,还有很多其他方法可以用于不同的操作。可以根据具体的需求选择合适的方法来操作 Stream。