最近在学java8的Stream流遇到以下一个坑:
请看代码:
@Test
public void test3() {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
boolean a = list.stream().peek(System.out::println).allMatch(i -> i > 3);
System.out.println(a);
System.out.println("-------------------------------");
List<Integer> list2 = Arrays.asList(1, 2, 3, 4, 5, 6);
list2.forEach(System.out::println);
boolean b = list2.stream().allMatch(i -> i > 3);
System.out.println(b);
}
输出结果:
1
false
-------------------------------
1
2
3
4
5
6
false
由此得出执行顺序为:
for (Integer i : list) {
peek(i)
if(!match(i)){
return;
}
}
总结:
预想的执行顺序是先peek完再执行allMatch
但是allMatch是一个短路操作。。
补充一下其他短路终端操作:
- 匹配所有 allMatch
- 任意匹配 anymMatch
- 不匹配 noneMatch
- 查找首个 findFirst
- 查找任意 findAny