我最近了解到Stream
S IN的Java 8,看到这个例子:了解Java 8流的过滤方法
IntStream stream = IntStream.range(1, 20);
现在,让我们说,我们想通过3和5,找到第一个号码,不要divisable两我们很可能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,过滤出那些divisable 3,然后重复这个新Stream
,发现那些通过5
是divisable而是我得到这个输出: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