终端操作会从通道流的流水线生成结果。其结果可以是任何不是流的值,例如int、List、void等。如果流操作后返回的值还是Stream流类型的,则是开始操作和中间操作。
有以下经常用到的查找与匹配操作:
allMatch——检查是否匹配所有元素
anyMatch——检查是否至少匹配一个元素
noneMatch——检查是否没有匹配的元素
findFirst——返回第一个元素
findAny——返回当前流中的任意元素
count——返回流中元素的总个数
max——返回流中最大值
min——返回流中最小值
下面进行示例演示,首先创建数据源为
private static List usrs = Arrays.asList(
new User("lzj", 20),
new User("zhangsan", 22),
new User("lisi", 25),
new User("suner", 30));
1、 allMatch——检查是否匹配所有元素
检查是否流中的所有User对象的年龄是否大于18.
@Test
public void test1(){
Boolean flag = usrs.stream()
.allMatch((x) -> x.getAge() > 18);
System.out.println(flag); //输出true
}
2、 anyMatch——检查是否至少匹配一个元素
检查是否流中的User对象有没有年龄大于25岁的。
@Test
public void test2(){
Boolean flag = usrs.stream()
.anyMatch((x) -> x.getAge() > 25);
System.out.println(flag); //输出true
}
3、 noneMatch——检查是否没有匹配的元素
检查流中是否User类型的对象年龄都不大于35岁。
@Test
public void test3(){
Boolean flag = usrs.stream()
.noneMatch((x) -> x.getAge() > 35);
System.out.println(flag); //输出true
}
4、 findFirst——返回第一个元素
或得满足条件的流中的第一个元素并放到Optional容器中。
@Test
public void test4(){
Optional user = usrs.stream()
.filter((x) -> x.getName().contains("s"))
.findFirst();
System.out.println(user.get());//输出:User [name=zhangsan, age=22]
}
5、 findAny——返回当前流中的任意元素
过滤出姓名包含s字符的User类型对象,获取满足条件的任何一个对象,并放到Optional容器中。
@Test
public void test5(){
Optional user = usrs.stream()
.filter((x) -> x.getName().contains("s"))
.findAny();
System.out.println(user.get());//输出:User [name=zhangsan, age=22]
}
6、 count——返回流中元素的总个数
过滤出名字包含s字符的所有User类型对象,并返回总个数。
@Test
public void test6(){
Long total = usrs.stream()
.filter((x) -> x.getName().contains("s"))
.count();
System.out.println(total);
}
7、 max——返回流中最大值
获取年龄最大的那个User类型对象,并放到Optional容器中
@Test
public void test7(){
Optional user = usrs.stream()
.max((x, y) -> x.getAge().compareTo(y.getAge()));
System.out.println(user);
}
8、 min——返回流中最小值
获取年龄最小的User类型对象,并放置到Optional容器中
@Test
public void test8(){
Optional user = usrs.stream()
.min((x, y) -> x.getAge().compareTo(y.getAge()));
System.out.println(user);
}
reduce(T identity, BinaryOperator) / reduce(BinaryOperator) ——可以将流中元素反复结合起来,得到一个值。
获取流中User对象年龄的总和。
/*reduce*/
@Test
public void test9(){
Integer total = usrs.stream()
.map(User::getAge)
.reduce(0, (x, y) -> x + y);
/*其中0、x、y和total的类型一致,都是Integer类型*/
System.out.println(total);//输出:97
}
开始流中放置的是每个user对象,经过map后,把每个user对象的年龄获取到放在流中,然后分别把年龄进行加起来,起始值是0,加总后的结果放在赋给total变量。
collect——将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法。
获取流中User类型对象的年龄,并把年龄重组成List类型
@Test
public void test10(){
List names = usrs.stream()
.map(User::getName)
.collect(Collectors.toList());
System.out.println(names);
}
运行方法,输出结果:
[lzj, zhangsan, lisi, suner]