gpt4 book ai didi

java - 可选的map()和filter()操作类型

转载 作者:行者123 更新时间:2023-12-02 08:31:08 24 4
gpt4 key购买 nike

Optionalmap()filter() 是否像 Stream 一样是惰性的?

我如何确认他们的类型?

最佳答案

Stream 之间存在根本区别和一个Optional .

一个Stream封装整个处理管道,在执行任何操作之前收集所有操作。这允许实现根据实际请求的结果来选择不同的处理策略。这还允许插入修饰符,如 unordered()parallel()进入链中,因为此时到目前为止还没有做任何事情,所以我们可以改变后续实际处理的行为。

一个极端的例子是Stream.of(1, 2, 3).map(function).count() ,不会处理 function在 Java 9 中,作为 3 的不变结果无需确定即可确定。

相比之下,Optional只是一个值的包装(如果不为空)。每个操作都将立即执行,以返回新的 Optional封装新值或空 Optional 。在 Java 8 中,所有方法都返回 Optional ,即map , flatMapfilter ,当应用于空可选时,只会返回一个空可选,因此当链接它们时,空可选变成一种死胡同。

但是 Java 9 将引入 Optional<T> or​(Supplier<? extends Optional<? extends T>>) ,当应用于空选项时,它可能会从供应商返回非空选项。

Optional代表一个(可能不存在)值,而不是一个处理管道,您可以查询相同的 Optional任意次数,查询是否返回新的 Optional或最终值。

很容易验证。代码如下

Optional<String> first=Optional.of("abc");
Optional<String> second=first.map(s -> {
System.out.println("Running map");
return s + "def";
});
System.out.println("starting queries");
System.out.println("first: "+(first.isPresent()? "has value": "is empty"));
System.out.println("second: "+(second.isPresent()? "has value": "is empty"));
second.map("second's value: "::concat).ifPresent(System.out::println);

将打印

Running map
starting queries
first: has value
second: has value
second's value: abcdef

证明映射函数在任何其他查询之前立即计算,并且我们仍然可以查询 first在我们通过 map 创建第二个之后可选并多次查询选项。

事实上,强烈建议通过 isPresent() 检查首先,在调用get()之前.

没有等效的流代码,如重用 Stream实例这种方式是无效的。但我们可以证明,在终端操作开始之前,中间操作不会执行:

Stream<String> stream=Stream.of("abc").map(s -> {
System.out.println("Running map");
return s + "def";
});
System.out.println("starting query");
Optional<String> result = stream.findAny();
System.out.println("result "+(result.isPresent()? "has value": "is empty"));
result.map("result value: "::concat).ifPresent(System.out::println);

将打印

starting query
Running map
result has value
result value: abcdef

显示在终端操作之前未评估映射函数findAny()开始。由于我们无法多次查询一个流,findAny()甚至使用Optional作为返回值,这允许我们对最终结果执行此操作。

<小时/>

同名操作之间还存在其他语义差异,例如Optional.map将返回一个空 Optional如果映射函数的计算结果为 null 。对于流来说,函数是否传递给 map 没有区别。返回null或非 null value(这就是为什么我们可以在不知道是否计算元素的情况下对元素进行计数)。

关于java - 可选的map()和filter()操作类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44202012/

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