blu*_*sky 4 java lambda functional-programming scala optional
我正在阅读Scala中的函数式编程,以下是它为使用Option
类型而不是检查get for 提供的两个优点null
:
它允许错误无声地传播 - 调用者可能忘记检查这种情况,并且不会被编译器警告,这可能导致后续代码无法正常工作.通常,在代码之后很久才会检测到错误.
除了容易出错之外,它还会在呼叫站点产生大量样板代码,并使用显式if语句来检查调用者是否收到了"真实"结果.如果碰巧调用多个函数,则会放大此样板文件,每个函数都使用必须以某种方式检查和聚合的错误代码.
对于第2点.虽然不必检查null
仍然必须检查Option
类型是否包含Some
或None
.该if
检查不除,它只是在做更明确的,而不是一个类型的是null
它可能不包含值.这是正确的解释吗?
虽然我引用了Scala一书Option
,但Java 8中也提供了类型,因此我认为在Java中也是有效的.
我们的想法是,不是费心去检查你的Option
是否,Some
或者None
只是将它转换成另一个Option
,使用一系列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;
}
Run Code Online (Sandbox Code Playgroud)
有很多方法可以用scala编写它,每种方法都比这更漂亮.例如(假设所有"可空"对象都由a表示Option
):
def getUserApartmentNumber(user: Option[User]) = user
.flatMap(_.address)
.flatMap(_.building)
.flatMap(_.apartment)
.map(_.getNumber)
.getOrElse(-1)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
96 次 |
最近记录: |