当前位置: 首页 > 知识库问答 >
问题:

找到流直到值-可选[重复]

郎刚捷
2023-03-14

我想在找到第一个值时终止流的执行。然而,当我运行下面的代码时,它显示,即使第一个方法中存在值,也会调用两个方法。

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();
    }

我登记了文件:

  1. 表示

如果存在值,则返回{@code true},否则返回{@code false}。

返回描述此流的第一个元素的{@link Optional},如果流为空,则返回空的{@code Optional}。如果流没有遭遇顺序,那么可以返回任何元素。

所以它满足了第一个条件,第二个条件似乎也满足了,因为它回来了:

first
second
someValue

如果出现第一个值,如何退出执行,而不执行第二个方法?

共有2个答案

姜飞飙
2023-03-14

问题不在于findFirst不是短路,而是流。of(first(),second())导致立即(而不是延迟)执行first()second。它本质上是作为任何普通表达式计算的。

换句话说,即使你的主要方法只是

final public static void main(String[] args) throws Exception {
    Stream.of(first(), second());
}

它仍然会立即执行first()second()

漆雕修德
2023-03-14

如果出现第一个值,如何退出执行,而不执行第二个方法?

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)等于该值。我想用什么语法? 也就是说,如何获取映射以返回正确的可选映射?

  • 我有以下函数,它试图逐步缩小输入集合的范围,直到找到单个元素,即当发现单个项目时,过滤应该停止,因为应用其他过滤器可能会导致根本不匹配。 随着每增加一个嵌套级别,这变得越来越难阅读,我想知道是否有更简洁的方法来编写这篇文章。 优选地,该方法应最多执行一次每个过滤步骤(尽管输入大小较小且过滤成本较低-对于同一输入可以执行多次),并包含单个出口点。