Nullable
(C#)有不同的含义,但无论如何Option
(Scala)和Nullable
都可以用来表达“有价值或无价值”的概念。
例如,如果您想在字符串中找到子字符串 - 而不是将Intscure -1作为Int,最好返回Option [Int](在Scala中,它将是None
)。
标准Java中是否有这样的类?如果是,那是什么?
请注意,我不是在问这样的课程。
正如我所写,Nullable
具有不同的含义。考虑一下:
想象一下Map [K,V]和方法获取哪个语义是获取密钥的值,如果有这样的密钥,或者什么时候没有这样的密钥。
由于两个原因你不能使用null,因为一个原因你不能使用任何具体的类。选项[V]是要走的路。
答案 0 :(得分:5)
在Java中,通常的方法是使用null
和Integer
,Long
等类(它们是{{的引用类型等价物) 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; - )
快乐的编码。
*我不同意Integer
或Double
履行此角色,因为它们只包装固定的基元集并且不是通用容器。可以认为它们涵盖Nullable
的情况,仅仅是由于Java的固定值集类型和C#对Nullable
的限制(仅适用于ValueTypes),但它们不替换真实的Option
类型。
请注意,来自FJ或Guava 的Option
仍然使用(它必须,实际上)包装类型(例如Integer
)来处理基元。另请注意,由于上述限制,C#中的Nullable
与Scala中的Option
不同。