java - 有什么方法可以从 Lambda 闭包中停止 Stream.generate 吗?

标签 java lambda java-8

我刚开始玩 Java 8 和 Lambda 表达式,我很好奇我是否可以通过返回特定值从 Lambda 表达式内部停止流生成 (如空)。 Stream.generate() 是否可行?

private int counter;

private void generate()
{
    System.out.println(Stream.generate(() -> {
        if (counter < 10) {
            counter++;
            return RandomUtils.nextInt(100);
        } else {
            return null;
        }
    }).count());
}

不幸的是,这段代码不会终止,所以通过简单地返回 null 不会跳出流。

最佳答案

Java 9 及更高版本包括 this method :

Stream<T> takeWhile(Predicate<? super T> predicate); 

按条件限制流。因此不再需要下面的解决方法。

原始答案(适用于 Java 9 之前的版本):

对于 Stream.generate,根据定义,这不可能来自 lambda 闭包。根据定义,它是无穷无尽的。使用 limit() 您可以调整流的大小。但这对您没有帮助,例如:

if random>10 then stop

有可能通过条件限制潜在的无限流。如果不知道尺寸,这很有用。您的 friend 是一个Spliterator,您的示例代码如下所示:

System.out.println( StreamSupport.stream(Spliterators.spliteratorUnknownSize(new Iterator<Integer>() {
    int counter = 0;

    @Override
    public boolean hasNext() {
        return counter < 10;
    }

    @Override
    public Integer next() {
        counter++;
        return RandomUtils.nextInt(100);
    }
}, Spliterator.IMMUTABLE), false).count());

基本上,您可以从Iterator 构建Stream。我正在使用这个结构,例如对于来自 Stax XML 的 XMLEvents 流 - 解析。

我知道这不是由 lambda 构造完成的,但它 IHMO 解决了这个缺少的按条件停止流项目生成的功能。

如果有更好的方法来实现这一点(我的意思是这个流构造而不是 XML 处理;))或者以这种方式使用流是否存在根本缺陷,我将非常感兴趣。

关于java - 有什么方法可以从 Lambda 闭包中停止 Stream.generate 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22630750/

相关文章:

java - 如何在 Neo4j 中查找特定节点

java - Java 中的常量数组

java.time.format.DateTimeParseException : Text '10-03-2021' could not be parsed at index 0

java - 局部变量必须是 final 或有效的 final

java - 如何将安装在移动设备上的 J2me Midlet 连接到 Java 应用程序?

java - LensKit:LensKit 演示未读取我的数据文件

visual-studio-2010 - 频繁的VS 2010速度非常慢,并且在特定的解决方案/文件上崩溃?

c# - 为什么我不能在 Tuple.Create 中使用 lambda 表达式?

lambda - Java 8 类型推断错误,将 lambda 表达式分配给 Object 类型的变量

Java 流到 String[] 数组