- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我通常对 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>>
列表的结果秒。在这种情况下,可能我的应用程序在以下方面存在重要差异:
Optional.empty()
所以我真的不希望语言或 API 假设两者之间没有区别,并转换 Optional<Optional<T>>
到Optional<T>
.
自从 List<E>.stream().findFirst()
总是 返回 Optional<E>
, 没有办法阻止 Optional<Optional<T>>
不妨碍我创建 List<Optional<T>>
(或 Collection
、 Set
、 HashMap<K, Optional<T>>
等)。因此,您基本上必须完全禁止嵌套泛型,这将导致功能的重大损失。
我对 Optional<Optional<T>>
的存在很满意,因为它与语言的其余部分完全一致。如果您不喜欢它们,请避免创建它们;但不要认为这适合其他所有人。
关于java - 为什么Java要堆叠Optionals?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46116252/
我经常使用 var options = options || {} 作为默认为空对象的方式。它通常用于初始化选项对象,以防它未在函数调用的参数中传递。 问题是我在几个地方(博客文章、源代码)读到opt
我是Python中Rust的新手。这是我学习Rust的第四天。 在第一个问题Type casting for Option type之后,我有一个跟语法match和所有权概念有关的后续问题。 首先,我
我正在学习 Ray Wenderlich。我遇到了闭包语法错误。我想知道 Xcode 提示是什么意思? Xcode 报告如下: /Users/.../FlickrPhotosViewControlle
使用 Python 编写命令行界面 (CLI) 时 click library , 是否可以定义例如三个选项,其中仅当第一个(可选)未设置时才需要第二个和第三个选项? 我的用例是一个登录系统,它允许我
我有一个这样的 JPA 查询。 PersonRepository.java public Optional> findByStatus(int status); 人员服务.java System.ou
我遇到了很多地方,我有类似的东西 def f(s: String): Option[Long] = ... def g(l: Long): IO[Option[Wibble]] = ... val a
我有一个results: List[Future[Option[T]]]其中包含(并行)计算。 我想获得第一个非None尽快出结果,或者返回None如果所有计算都返回 None . 目前,我正在这样做
我正在尝试加载一个简单的 Listbox组件来自 @headlessui/react . 选择.tsx type Option = { id: number name: string
如何将Future[Option[Future[Option[X]]]]转换为Future[Option[X]]? 如果它是 TraversableOnce 而不是 Option 我会使用 Futur
Haskell、Rust 等语言提供了一个 Maybe 或 Option 类型。即使在 Java 中,也有一个 Optional 现在打字。 为简单起见,我将在剩下的问题中将此类型称为“选项类型”。
当我尝试在 SQL 中存储一个 XML 而不是一个空元素时,SQL 只是更改它并仅使用一个元素标签来存储它。例如,要存储的 XML 是: ROGER 然后Sql存起来就好了
使用这个非常好的命令行解析器 Argo(仅 header C++ 库)我遇到了一个小问题。请参阅:https://github.com/phforest/Argo Argo 返回:'Error: Un
我是来自 Java 背景的 Scala 新手,目前对考虑 Option[T] 的最佳实践感到困惑. 我觉得用 Option.map只是更实用和美观,但这不是说服其他人的好理由。有时, isEmpty
这个问题在这里已经有了答案: Chaining Optionals in Java 8 (9 个回答) Optional orElse Optional in Java (6 个回答) Functio
Optional::stream如果存在,则返回一个包含该值的 Stream,否则返回一个空流。所以对于 Stream> optionals , optionals.flatMap(Optional:
我使用箭头键作为输入,在 printf 菜单中上下移动 printf 箭头(“==>”)。 我正在使用一个函数来计算箭头应该在的位置,并使用 switch case 和 printf("\n==>")
这个问题在这里已经有了答案: What does the construct x = x || y mean? (12 个答案) 关闭 9 年前。 如我的问题标题所述,我最近偶然发现了这个变量声明:
这个问题在这里已经有了答案: BackboneJS: What is options || (options = {}); in Backbone source code (1 个回答) 关闭 8
我有这个简单的语法: word = Word(alphanums + '_') with_stmt = Suppress('with') + OneOrMore(Group(word('key') +
使用 Cucumber 和 SitePrism 编写测试,我在页面上有以下 HTML... Select a Status Active Product Inactive Prod
我是一名优秀的程序员,十分优秀!