番石榴的可选课程有什么意义

2022-08-31 11:23:21

我最近读到了关于这个的文章,看到人们使用这个类,但在几乎所有情况下,使用也会起作用 - 如果不是更直观的话。有人能提供一个具体的例子,在哪里可以实现无法实现或以更干净的方式实现的事情吗?我唯一能想到的就是用它来接受键,但即使这样,也可以用null值的侧面“映射”来完成。谁能给我一个更令人信服的论据?nullOptionalnullMapsnull


答案 1

番石榴团队成员在这里。

可能最大的缺点是,在任何给定的上下文中,它的含义都不明显:它没有说明性的名称。这并不意味着“此参数没有值”并不总是很明显 - 哎呀,作为返回值,有时它意味着“错误”,甚至“成功”(!!),或者只是“正确答案为无”。 通常是您使变量为 null 时实际表示的概念,但并非总是如此。如果不是这样,我们建议您编写自己的类,类似于但使用不同的命名方案,以明确您的实际含义。nullnullOptionalOptional

但我想说,最大的优势不在于可读性:优势在于它的白痴证明。如果您希望程序进行编译,它会迫使您积极考虑不存在的情况,因为您必须主动解开包装并解决这种情况。Null使简单地忘记事情变得令人不安,尽管FindBugs有所帮助,但我认为它并没有很好地解决这个问题。当您返回可能“存在”或可能不存在的值时,这尤其重要。您(和其他人)更有可能忘记可能返回值,而不是在实现时可能忘记。返回使调用方无法忘记该大小写,因为他们必须自己解开对象的包装。OptionalOptionalother.method(a, b)nullanullother.methodOptional

出于这些原因,我们建议您使用方法作为返回类型,但不一定在方法参数中使用。Optional

(顺便说一句,这完全是从这里的讨论中得到的。


答案 2

它真的看起来像Haskell的May Maybe Monad模式。

你应该阅读以下内容,Wikipedia Monad(函数式编程):

并在Kerflyn的博客上阅读从可选到番石榴的Monad,其中讨论了用作Monad的番石榴的可选性:


编辑:在 Java8 中,有一个内置的 Optional,它具有像 .这一直是一个有争议的话题,但最终得到了实施。flatMap

查看 http://www.nurkiewicz.com/2013/08/optional-in-java-8-cheat-sheet.html

public Optional<String> tryFindSimilar(String s)  //...

Optional<Optional<String>> bad = opt.map(this::tryFindSimilar);
Optional<String> similar =       opt.flatMap(this::tryFindSimilar);

运算符对于允许 monadic 操作至关重要,并且允许轻松地链接所有返回可选结果的调用。flatMap

想想看,如果你使用运算符5次,你最终会得到一个,而使用会给你mapOptional<Optional<Optional<Optional<Optional<String>>>>>flatMapOptional<String>

从Java8开始,我宁愿不使用番石榴的Anstable,它的功能不那么强大。


推荐