微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java Stream 生成的值多于限制集

如何解决Java Stream 生成的值多于限制集

由于某种原因,Java Stream 生成了更多的值(调用迭代器的 hasNext() 和 next() 方法

这是合成示例。

我有一个迭代器形式的生成器:

@requiredArgsConstructor
static class TestIterator implements Iterator<Integer> {
    private final int bound;
    private final Random rnd = new Random();

    private int current = 0;

    @Override public boolean hasNext() {
        return current < bound;
    }

    @Override public Integer next() {
        current = rnd.nextInt(20);
        System.out.println("Generated: " + current);
        return current;
    }
}

现在,我正在尝试创建一个由几个迭代器组成的扁平流

public static void main(String... args) {

    List<Iterator<Integer>> iterators = asList(
        new TestIterator(18),new TestIterator(18),new TestIterator(18));
    Stream<Integer> streams = iterators.stream()
        .map(iter -> (Iterable<Integer>) () -> iter)
        .flatMap(iter -> StreamSupport.stream(iter.spliterator(),false)) // <-- Here the stream of streams is flatten to a single stream of integers and 'parallel' is set to false
        .limit(5); // <-- Here the limit is set

    streams.forEach(i -> System.out.println("***Consumed: " + i));
}

而且,令我惊讶的是,输出如下:

Generated: 1
***Consumed: 1
Generated: 19
***Consumed: 19
Generated: 7
***Consumed: 7
Generated: 7
***Consumed: 7
Generated: 7
***Consumed: 7
Generated: 4
Generated: 3
Generated: 8
Generated: 14
Generated: 0
Generated: 16
Generated: 10
Generated: 3
Generated: 19

因此,Stream 生成的结果比在 forEach 中传递给消费者的结果要多。 即使它明确设置了 'parallel = false'。

在我的实际场景中,hasNext() 和 next() 函数非常昂贵,需要从外部服务获取数据。

谁能解释一下如何在限制结果方面做得更好?

提前致谢。

解决方法

这是一个 known JDK bug,已在 JDK 10+ 中修复并反向移植到 openjdk8u222,因此更新您的 Java 版本将解决该问题。

,

正如我在您的代码中看到的那样 You have made the integer value bound final

因为它是一个不可变的值,所以你的 hasNext() 函数调用不间断地运行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。