Java 8 Streams中间操作的完整指南。 所有内置Stream API中间操作(方法)的列表以及示例。
1.概述
在本教程中,我们将学习什么是 Java 8 Stream 中的中间操作 。 所有这些操作都在java.util.stream.Stream包中 。
在上一教程中,我们讨论了Java 8 Stream API和Lambda Expressions 。
规则:
Java 8 Stream中间操作返回另一个Stream ,该Stream允许您以查询的形式调用多个操作。
在调用终端操作之前,流中间操作不会执行。
所有的中间操作都是惰性的,因此直到实际需要处理结果时才执行它们。
在执行管道的终端操作之前,流的遍历不会开始。
这是所有Stream中间操作的列表:
过滤()
地图()
flatMap()
不同()
sorted()
窥视()
限制()
跳跃(
我们将在后续文章中看到有关每个操作的示例程序。
2. filter()
返回由该流的元素组成的流
匹配给定的谓词 。
句法:
Stream filter(Predicate predicate)
例:
Stream intStream = Stream.of( 1 , 2 , 3 , 4 , 5 ); Stream subStream = intStream.filter(value -> value > 3 ); long count = subStream.count(); System.out.println(count);
输出:
2
该程序将Predicate功能接口用作lambda,并检查数字是否大于3。
3. map()
返回包含以下内容的流
将给定功能应用于此流元素的结果 。
句法:
Stream map(Function mapper)
例:
// map() Operation Stream strStream = Stream.of( "Welcome" , "To" , "java" , "blog" ); Stream subStream2 = strStream.map(string -> {
if (string == "java" )
return "Java-W3schools" ;
return string; }); List welomeList = subStream2.collect(Collectors.toList()); System.out.println(welomeList);
在此,map函数采用Function的参数类型。 该功能是一个功能接口,并具有一种方法
apply() 。 此方法采用一个值并返回另一个值。
输出:
[Welcome, To, Java-W3schools, blog]
在此示例中,将单词“ java”替换为“ Java-W3schools”。
map()wrpper类型也属于中间操作类别。
mapToDouble(),mapToLong(),mapToInt()
4. flatMap()
此平面图最适合于收藏列表。 我们将显示带有两个列表的示例,以及如何使用它们将它们转换为单个流
flatmap()方法。
句法:
Stream flatMap(Function> mapper)
例:
示例程序可计算两个列表中唯一水果名称的数量。
Stream flatStream = stream.flatMap(list -> list.stream()); //flatStream.forEach(str -> System.out.println(str)); long distinctFruites = flatStream.distinct().count(); System.out.println(distinctFruites);
输出:
6
并且在使用Stream“ 流已被操作或关闭 ”时也看到了解决方案中最常见的问题。 取消换行后flatStream.forEach(str-> System.out.println(str)); 此程序将异常java.lang.IllegalStateException 。
类似包装器类型的flatMap()方法,例如flatMapToInt(),flatMapToLong(),flatMapToDouble() 。
5.独特的
返回由该流的不同元素组成的流 (根据Object.equals(Object))。
对于有序流,对不同元素的选择是稳定的(对于重复元素,将保留在遇到顺序中首先出现的元素。)对于无序流,则不保证稳定性。
句法:
Stream distinct()
例:
// distinct() Operation Stream fruitsStream = Stream.of( "Apple" , "Jack Fruit" , "Water Melon" Stream fruitsStream = Stream.of( "Water Melon" , "Apple" ); Stream distinctStream = fruitsStream.distinct(); distinctStream.forEach(name -> System.out.println(name));
输出:
Apple Jack Fruit Water Melon
6. sorted()
返回由该流的元素组成的流,并根据自然顺序排序。
如果此流的元素不可比较,则在执行终端操作时可能会引发java.lang.ClassCastException。
注意 :对于有序流,排序是稳定的。 对于无序流,不保证稳定性。
句法:
Stream sorted()
例:
// sort() Operation Stream vegStream = Stream.of( "tomoto" Stream vegStream = Stream.of( "tomoto" , "Green Chilli" , "Pototo" , "Beet root" ); Stream sortedStream = vegStream.sorted(); sortedStream.forEach(name -> System.out.println(name));
输出:
Beet root Green Chilli Pototo tomoto
7. peek()
返回由该流的元素组成的流,并在从结果流中消耗元素时对每个元素另外执行提供的操作。
peek()方法是在Java 8中调试流的最佳方法。eclipse将不支持调试。
注意:我们无法预测并行流管道的peek()调用顺序。
句法:
Stream peek(Consumer action)
例:
// peek() Operation Stream.of( "one" , "two" , "three" , "four" ).filter(e -> e.length() > 3 )
.peek(e -> System.out.println( "Filtered value: " + e)).map(String::toUpperCase)
.peek(e -> System.out.println( "Mapped value: " + e)).collect(Collectors.toList());
对于每次满足过滤条件的条件,将立即调用peek()方法。 看到输出,您将更好地理解。
输出:
Filtered value: three Mapped value: THREE Filtered value: four Mapped value: FOUR
8. limit()
返回具有指定大小的流 。 它将截断流中剩余的元素。
注意: limit()适用于顺序流,不能为并行流提供良好的性能结果。
句法:
Stream limit( long maxSize)
例:
程序将流限制为前两个元素。
Stream.of( "one" , "two" , "three" , "four" ).limit( 2 ).forEach(item -> System.out.println(item));
输出:
one two
9. skip()
此方法跳过给定的n个元素,并返回Stream。 当要对列表或流中的最后n条记录或行执行任何操作时,这是最有用的。
句法:
Stream skip( long n)
例:
程序跳过前两个元素并打印其余元素。
Stream.of( "one" , "two" , "three" , "four" , "five" ).skip( 2 ).forEach(item -> System.out.println(item));
输出:
three four five
10.结论
在本教程中,我们已经了解了什么是流中的中间操作。 中间操作如何在新的Java 8 Streams中工作。
并且还讨论了带有示例程序的所有中间方法的列表。
这篇文章中显示的所有程序都通过GitHub进行 。
翻译自: https://www.javacodegeeks.com/2020/04/java-8-stream-intermediate-operations-methods-examples.html