gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:59:55 24 4
gpt4 key购买 nike

我刚开始玩 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com