Java中是否有标准的Option或Nullable类?

时间:2012-03-21 20:22:01

标签: java class option

Nullable(C#)有不同的含义,但无论如何Option(Scala)和Nullable都可以用来表达“有价值或无价值”的概念。

例如,如果您想在字符串中找到子字符串 - 而不是将Intscure -1作为Int,最好返回Option [Int](在Scala中,它将是None )。

标准Java中是否有这样的类?如果是,那是什么?

请注意,我不是在问这样的课程。

更新

正如我所写,Nullable具有不同的含义。考虑一下:

想象一下Map [K,V]和方法获取哪个语义是获取密钥的值,如果有这样的密钥,或者什么时候没有这样的密钥。

由于两个原因你不能使用null,因为一个原因你不能使用任何具体的类。选项[V]是要走的路。

3 个答案:

答案 0 :(得分:5)

在Java中,通常的方法是使用nullIntegerLong等类(它们是{{的引用类型等价物) 1}},int等原始类型;作为引用类型,引用可以是long)。如果您有C#背景,Java中的null(带有自动装箱)有点像C#中的Integer

例如,List#indexOf有这个签名:

int?

...并且你正在谈论的int indexOf(Object o) 事情。如果您正在设计-1并首选List,则可能将其定义为:

null

...并在“未找到”案例中返回Integer indexOf(Object o) 而不是null

Java中存在所有基本类型的这些引用类型版本,当然,所有其他类型都已经是引用类型,因此您已经拥有-1选项。

答案 1 :(得分:5)

你问过两年多以前,但两个月前,Java SE 8引入了java.util.Optional<T>。有关介绍,请参阅此Technet文章:

Tired of Null Pointer Exceptions? Consider Using Java SE 8's Optional!

答案 2 :(得分:2)

没有。 Java中没有这样的构造标准。 *

Option in FunctionalJava或正如yshavit所说,Optional in Guava ...或者,你可以创建自己的类型......但没有适当的语言支持......好吧,我只想说我避免Java; - )

快乐的编码。


*我不同意IntegerDouble履行此角色,因为它们只包装固定的基元集并且不是通用容器。可以认为它们涵盖Nullable的情况,仅仅是由于Java的固定值集类型和C#对Nullable的限制(仅适用于ValueTypes),但它们替换真实的Option类型。

请注意,来自FJ或Guava Option仍然使用(它必须,实际上)包装类型(例如Integer)来处理基元。另请注意,由于上述限制,C#中的Nullable与Scala中的Option不同。