使用选项类型删除是否需要if语句?

blu*_*sky 4 java lambda functional-programming scala optional

我正在阅读Scala中的函数式编程,以下是它为使用Option类型而不是检查get for 提供的两个优点null:

  1. 它允许错误无声地传播 - 调用者可能忘记检查这种情况,并且不会被编译器警告,这可能导致后续代码无法正常工作.通常,在代码之后很久才会检测到错误.

  2. 除了容易出错之外,它还会在呼叫站点产生大量样板代码,并使用显式if语句来检查调用者是否收到了"真实"结果.如果碰巧调用多个函数,则会放大此样板文件,每个函数都使用必须以某种方式检查和聚合的错误代码.

对于第2点.虽然不必检查null仍然必须检查Option类型是否包含SomeNone.该if检查不除,它只是在做更明确的,而不是一个类型的是null它可能不包含值.这是正确的解释吗?

虽然我引用了Scala一书Option,但Java 8中也提供了类型,因此我认为在Java中也是有效的.

Dim*_*ima 6

我们的想法是,不是费心去检查你的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)