java - 使用选项类型是否不需要 if 语句?

标签 java scala lambda functional-programming option-type

我正在阅读 Scala 中的函数式编程,这是它为使用 Option 提供的两个优势键入而不是检查 null 的获取:

  1. 它允许错误悄无声息地传播——调用者可能会忘记检查这个条件并且不会被编译器提醒,这可能会导致后续代码无法正常工作。通常直到代码中很晚才检测到错误。

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

对于第 2 点,虽然不必检查 null仍然需要检查 Option类型包含 SomeNone . if检查没有被删除,它只是变得更明确,而不是类型是 null它可能不包含值。这是正确的解释吗?

虽然我引用了一本 Scala 书 Option类型在 Java 8 中也可用,因此我认为在 Java also 部分也是有效的。

最佳答案

这个想法是,与其费心去检查你的 OptionSome 还是 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/

相关文章:

java - eclipse动态web项目默认起始页

scala - 如何从 Argonaut Json 对象中删除具有空值的键

c# - IQueryable 与 Linq 表达式导致 NullReferenceException

java - Spring MVC : Controller does not run in an ApplicationContext

java - 使用正则表达式java替换字符串中某个字符的前后

java - Java 中的并发 - 仅在一个方法上?

scala - Spark 嵌套转换 SPARK-5063

scala - 如何从 Scala 的集合中选择一个随机值

java - 如何在 Scala 中使用 Java lambda

lambda - Java 8 构造函数引用的类型是什么?