我最近了解到Stream
Java 8 中的 s 并看到了这个示例:
IntStream stream = IntStream.range(1, 20);
现在,假设我们想要找到第一个既能被 3 又能被 5 整除的数字。我们可能会filter
两次并且findFirst
如下:
OptionalInt result = stream.filter(x -> x % 3 == 0)
.filter(x -> x % 5 == 0)
.findFirst();
这一切听起来都很合理。当我尝试这样做时,令人惊讶的部分出现了:
OptionalInt result = stream.filter(x -> {System.out.println(x); return x % 3 == 0;})
.filter(x -> {System.out.println(x); return x % 5 == 0;})
.findFirst();
System.out.println(result.getAsInt());
我期望得到类似的东西:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
进而:3 6 9 12 15 18
。因为我们首先迭代 1 到 20 之间的所有数字,所以只过滤掉那些能被 3 整除的数字,然后迭代这个新的Stream
并找出那些能被 5 整除的数。
但我得到了这个输出:1 2 3 3 4 5 6 6 7 8 9 9 10 11 12 12 13 14 15 15 15
看起来它并没有涵盖所有数字。此外,看起来它检查x % 5 == 0
只适用于那些能被3整除的数字。
我不明白它为什么不迭代所有数字。
这是在线代码片段:http://www.tryjava8.com/app/snippets/5454a7f2e4b070922a64002b