我想在找到第一个值时终止流的执行。然而,当我运行下面的代码时,它显示,即使第一个方法中存在值,也会调用两个方法。
public static void main(String[] args) {
Optional<String> s = Stream.of(first(), second())
.filter(Optional::isPresent)
.findFirst()
.flatMap(Function.identity());
System.out.println(s.get());
}
private static Optional<String> first() {
System.out.println("first");
return Optional.of("someValue");
}
private static Optional<String> second() {
System.out.println("second");
return Optional.empty();
}
我登记了文件:
如果存在值,则返回{@code true},否则返回{@code false}。
返回描述此流的第一个元素的{@link Optional},如果流为空,则返回空的{@code Optional}。如果流没有遭遇顺序,那么可以返回任何元素。
所以它满足了第一个条件,第二个条件似乎也满足了,因为它回来了:
first
second
someValue
如果出现第一个值,如何退出执行,而不执行第二个方法?
问题不在于findFirst
不是短路,而是流。of(first(),second())
导致立即(而不是延迟)执行first()
和second
。它本质上是作为任何普通表达式计算的。
换句话说,即使你的主要方法只是
final public static void main(String[] args) throws Exception {
Stream.of(first(), second());
}
它仍然会立即执行first()
和second()
。
如果出现第一个值,如何退出执行,而不执行第二个方法?
Stream#findFirst
是一种短路终端操作。然而,当您调用流时,这些方法正在被调用。of(first(),second())
。这可以通过以下代码片段来证明:
Optional<String> s = Stream.of(first(), second())
.peek($ -> System.out.println("Hello World!"))
.filter(Optional::isPresent)
.findFirst()
.flatMap(Function.identity());
System.out.println(s.get());
输出:
first
second
Hello World!
someValue
为了防止调用的流时执行first()
和second()
,一种解决方案是将它们包装在供应商中
Stream<Supplier<Optional<String>>> stream = Stream.of(Test::first, Test::second);
Optional<String> s = stream.map(Supplier::get)
.filter(Optional::isPresent)
.findFirst()
.flatMap(Function.identity());
System.out.println(s.get());
输出:
first
someValue
该函数的目标是创建一个周期性地发出值的流,直到遇到与谓词匹配的值。 下面是我提出的一些框架代码: 和一些将检索正确阶段的callable,我应该能够传递callable和谓词检查是否,并轮询直到获得事件。 我遇到的问题是,当收到的事件不是最终事件时,生成一个可观察的事件。在这种情况下,observable应该继续轮询事件,直到它接收到与谓词匹配的事件,或者直到它没有更多的订阅服务器。 这一点可以观
致命错误:在展开可选值时意外发现nil。 我相信这很容易修复,但我对此相当陌生--我做错了什么?
我正试图运行此代码,但不断收到以下错误: 致命错误:在展开可选值时意外发现nil 我不明白这是什么意思,也不明白我为什么要得到它。有什么提示吗?
我想每2分钟运行一次这个方法,直到单元格的值变成。 是否可以使用CompletableFuture实现这一点?
我正在尝试这样做: 实际上,我想要的是返回一个可选的。of(foundVal)如果找到,否则为可选。空()。我不认为这是可选的。of(null)等于该值。我想用什么语法? 也就是说,如何获取映射以返回正确的可选映射?
我有以下函数,它试图逐步缩小输入集合的范围,直到找到单个元素,即当发现单个项目时,过滤应该停止,因为应用其他过滤器可能会导致根本不匹配。 随着每增加一个嵌套级别,这变得越来越难阅读,我想知道是否有更简洁的方法来编写这篇文章。 优选地,该方法应最多执行一次每个过滤步骤(尽管输入大小较小且过滤成本较低-对于同一输入可以执行多次),并包含单个出口点。