番石榴的可选课程有什么意义
我最近读到了关于这个的文章,看到人们使用这个类,但在几乎所有情况下,使用也会起作用 - 如果不是更直观的话。有人能提供一个具体的例子,在哪里可以实现无法实现或以更干净的方式实现的事情吗?我唯一能想到的就是用它来接受键,但即使这样,也可以用null值的侧面“映射”来完成。谁能给我一个更令人信服的论据?null
Optional
null
Maps
null
我最近读到了关于这个的文章,看到人们使用这个类,但在几乎所有情况下,使用也会起作用 - 如果不是更直观的话。有人能提供一个具体的例子,在哪里可以实现无法实现或以更干净的方式实现的事情吗?我唯一能想到的就是用它来接受键,但即使这样,也可以用null值的侧面“映射”来完成。谁能给我一个更令人信服的论据?null
Optional
null
Maps
null
番石榴团队成员在这里。
可能最大的缺点是,在任何给定的上下文中,它的含义都不明显:它没有说明性的名称。这并不意味着“此参数没有值”并不总是很明显 - 哎呀,作为返回值,有时它意味着“错误”,甚至“成功”(!!),或者只是“正确答案为无”。 通常是您使变量为 null 时实际表示的概念,但并非总是如此。如果不是这样,我们建议您编写自己的类,类似于但使用不同的命名方案,以明确您的实际含义。null
null
Optional
Optional
但我想说,最大的优势不在于可读性:优势在于它的白痴证明。如果您希望程序进行编译,它会迫使您积极考虑不存在的情况,因为您必须主动解开包装并解决这种情况。Null使简单地忘记事情变得令人不安,尽管FindBugs有所帮助,但我认为它并没有很好地解决这个问题。当您返回可能“存在”或可能不存在的值时,这尤其重要。您(和其他人)更有可能忘记可能返回值,而不是在实现时可能忘记。返回使调用方无法忘记该大小写,因为他们必须自己解开对象的包装。Optional
Optional
other.method(a, b)
null
a
null
other.method
Optional
出于这些原因,我们建议您使用方法作为返回类型,但不一定在方法参数中使用。Optional
(顺便说一句,这完全是从这里的讨论中得到的。
它真的看起来像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次,你最终会得到一个,而使用会给你map
Optional<Optional<Optional<Optional<Optional<String>>>>>
flatMap
Optional<String>
从Java8开始,我宁愿不使用番石榴的Anstable,它的功能不那么强大。