【发布时间】:2014-11-01 09:39:33
【问题描述】:
我最近了解了 Java 8 中的 Streams 并看到了这个例子:
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 整除的数字。
我不明白它为什么不遍历所有数字。
这是代码的在线 sn-p:http://www.tryjava8.com/app/snippets/5454a7f2e4b070922a64002b
【问题讨论】:
标签: java filter java-8 java-stream