我正在阅读 Scala 中的函数式编程,这是它为使用 Option
提供的两个优势键入而不是检查 null
的获取:
它允许错误悄无声息地传播——调用者可能会忘记检查这个条件并且不会被编译器提醒,这可能会导致后续代码无法正常工作。通常直到代码中很晚才检测到错误。
除了容易出错之外,它还会在调用站点生成大量样板代码,并使用显式 if 语句检查调用方是否收到“真实”结果。如果您碰巧调用多个函数,则此样板会被放大,每个函数都使用必须以某种方式检查和聚合的错误代码。
对于第 2 点,虽然不必检查 null
仍然需要检查 Option
类型包含 Some
或 None
. if
检查没有被删除,它只是变得更明确,而不是类型是 null
它可能不包含值。这是正确的解释吗?
虽然我引用了一本 Scala 书 Option
类型在 Java 8 中也可用,因此我认为在 Java also 部分也是有效的。
最佳答案
这个想法是,与其费心去检查你的 Option
是 Some
还是 None
,你只需将它转换成另一个 选项
,使用一系列monadic 操作 或者只是在最后提供一个默认值。想象一下在 Java 中是这样的:
int getUserApartmentNumber(User user) {
if(user != null) {
Address address = user.getAddress();
if(address != null) {
Building building = address.getBuilding();
if (building != null) {
Apartment apartment = building.getApartment();
if(apartment != null) {
return apartment.getNumber();
}
}
}
}
return -1;
}
有很多方法可以用 scala 编写它,每一种都比这更漂亮。例如(假设所有“可空”对象都由 Option
表示):
def getUserApartmentNumber(user: Option[User]) = user
.flatMap(_.address)
.flatMap(_.building)
.flatMap(_.apartment)
.map(_.getNumber)
.getOrElse(-1)
关于java - 使用选项类型是否不需要 if 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36291374/