Java 8 Streams - Iterator没有像预期的那样工作

时间:2014-05-07 02:25:45

标签: java lambda iterator java-8

为什么.next()会像我预期的那样返回7而不是8?

List<Integer> intList = new ArrayList<>();

IntStream.range(0, 10)
    .forEach(i -> intList.add(i));

int value = intList.stream()
            .filter(number -> number == 7)
            .iterator()
            .next();         // returns 7, not 8.

3 个答案:

答案 0 :(得分:6)

过滤器将流过滤到仅与条件number == 7匹配的元素(即只有一个元素,恰好是整数7),然后next()返回第一个(仅限于)元素。请注意,为了获得Iterator中的第一个元素,您需要拨打next()一次。

如果您确定需要此有序列表中7之后的第一个元素,则可以将过滤器更改为number -> number > 7

答案 1 :(得分:4)

除了其他答案指出的错误过滤谓词问题之外,使用iterator()应该是您的最后手段。这种方法(和它的朋友,spliterator())是由#34;逃避舱口&#34;对于标准流方法无法满足您需求的情况。

在这种情况下,如果您只想要第一个元素,则可以调用findFirst()。如果要将结果放入数组或集合中,请使用toArray()collect()

答案 2 :(得分:2)

这实际上是正确的,因为您正在过滤列表并且只考虑满足lambda表达式number -> number == 7的元素。因此,列表中只有一个元素可以通过。