gpt4 book ai didi

java - 为什么Java要堆叠Optionals?

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:02:51 25 4
gpt4 key购买 nike

我通常对 Java 语言的设计非常满意,但今天我遇到了一个奇怪的设计选择。我不知道有任何平台可以建议对版本 9 或 10 的 Java 语言进行更改,因此我在这里写下这个问题。


如果值为 null,则使用 Optionals 可以更好地控制行为.

今天我将流中的一个值映射到 Optional .我真的很惊讶,findFirst然后给我一个Optional<Optional<T>>而不仅仅是 Optional<T> .

Optional<Optional<T>> 有什么意义? ?

对于 Java 9 和 Streams,这是通过 .flatMap(Optional::stream) 解决的但这只是一种解决方法和样板代码。

如果 Optionals 通常不会堆叠并且总是平坦的,那不是更好吗?

Optional<Optional<T>> => Optional<T>
Optional.of(Optional.of("")) => Optional.of("")

进一步说明:

使用 Optionals 你不关心 sub optional 是否为 null 或者实际对象是否为 null .它总是会归结为 Optional.empty() .

String s = null;
Optional<String> opt = null;
Optional.of(s) => Optional.empty()
Optional.of(opt) => Optional.empty()

此外,如果您使用的是可选项,那么您只对对象感兴趣。因此,如果您尝试获取该对象,您总是必须双重获取并检查可选对象。

if(optionalOfOptional.isPresent()) {
optional = optionalOfOptional.get();
if(optional.isPresent()) {
objectOfInterest = optional.get();
}
}

我什至认为这是错误的来源,因为如果你以你的对象存在为条件,你总是需要检查两个可选项。

if(optionalOfOptional.isPresent() && optionalOfOptional.get().isPresent()) {
...
}

只检查第一个可选项很容易导致错误。

此外,为什么有一个 null 的 Optional 有意义?首先?摆脱使用 null 不是可选的?


在方法层面,这肯定可以解决。

例如Optional.of可能看起来像:

public static <T> Optional<T> of(T value) {
return value instanceof Optional ? value : new Optional<>(value);
}

在类型级别上,这可能并不那么容易。

最佳答案

禁止 Optional<Optional<T>> 根本没有意义.

假设您有一个 List<Optional<T>> .以下列表是不同的:

List<Optional<T>> listA = Arrays.asList(Optional.empty());
List<Optional<T>> listB = Arrays.asList();

它们明显不同:第一个是非空的,第二个是空的。

相应的,调用findFirst()的结果他们的流是不同的:

System.out.println(listA.stream().findFirst().isPresent()); // true
System.out.println(listB.stream().findFirst().isPresent()); // false

现在,我知道了 Java 不可能知道的那些列表中数据的含义。假设列表包含调用 Callable<Optional<T>> 列表的结果秒。在这种情况下,可能我的应用程序在以下方面存在重要差异:

  • 我调用了 N>0 个可调用对象,它们都返回了 Optional.empty()
  • 我调用了零个可调用对象。

所以我真的不希望语言或 API 假设两者之间没有区别,并转换 Optional<Optional<T>>Optional<T> .

自从 List<E>.stream().findFirst() 总是 返回 Optional<E> , 没有办法阻止 Optional<Optional<T>>不妨碍我创建 List<Optional<T>> (或 CollectionSetHashMap<K, Optional<T>> 等)。因此,您基本上必须完全禁止嵌套泛型,这将导致功能的重大损失。

我对 Optional<Optional<T>> 的存在很满意,因为它与语言的其余部分完全一致。如果您不喜欢它们,请避免创建它们;但不要认为这适合其他所有人。

关于java - 为什么Java要堆叠Optionals?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46116252/

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