美文网首页
java8 Optional使用误区

java8 Optional使用误区

作者: 饱饱想要的灵感 | 来源:发表于2022-08-17 16:52 被阅读0次

误区一 Optional 类型作为字段或参数

分析:

  • Optional 不可序列化,如果所在类可序列化就会出问题
  • 由于字段和参数可能被赋值为null, 实际使用时需要再次判断 optional != null, 造成了二次判断, Optional 本身就是为了清晰表达 "没有值"而设计的

误区二 对数据库输入参数做Optional判断

错误例子:

public User getUserById(String userId) {
    return Optional.ofNullable(userId).map(id -> userDao.findById(id)).orElse(null);
}

分析: 对不符合要求的输入应立即拒绝,防止对下层代码造成压力和污染

正确写法:

public User getUserById(String userId) { 
    // 直接抛出NullPointerException异常
    return userDao.findById(Objects.requireNoNull(userId, "userId不能为空"); 
}

误区三 Optional.map(...) 中再次 null 判断

错误例子:

 String productName = Optional.ofNullable(user)
    .map(User::getOrder)
    .flatMap(order -> Optional.ofNullable(order.getProduct())) // 判断1
    .flatMap(product -> Optional.ofNullable(product.getName()))  // 判断2
    .orElse("");

分析: Optional的map()方法已经对null值进行了处理, 无须二次判断, 请看源代码

public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
    Objects.requireNonNull(mapper);
    // public boolean isPresent(){return value != null;}
    if (!isPresent())
        return empty();
    else {
        return Optional.ofNullable(mapper.apply(value));
    }
}

正确写法:

String productName = Optional.ofNullable(user)
    .map(User::getOrder)
    .map(Order::getProduct)
    .map(Product::getName)
    .orElse("");

误区四 Optional.ofNullable() 应用于明确非 null 的值

错误例子:

Optional.ofNullable(100);

分析: ofNullable 包含了空判断, 如果明确非空, 就会造成二次判断, 请看源代码

public static <T> Optional<T> ofNullable(T value) {
    return value == null ? empty() : of(value);
}

正确写法:

Optional.of(100);

相关文章

  • java8中的函数式编程

    作者:刘仁鹏参考资料: 使用 Java8 Optional 的正确姿势 《Java8函数式编程》Richard W...

  • 学习Optional 类

    1.介绍 Optional类是Java8为了解决null值判断问题,,使用Optional类可以避免显式的null...

  • Java8特性之Optional

    一、什么是Optional Optional从名字上看,意思应该是可选项的意思,那么在Java8的实际使用中,我们...

  • Optional

    Java8中Optional为util包中一个类 创建Optional对象 Optional.of() 传入对象不...

  • JAVA8新特性-Optional类解决NPE问题

    ** JAVA8新特性-Optional类解决NPE问题** API介绍 1、Optional(T value),...

  • Optional源码分析(未完)

    Optional源码分析(未完) Optional 类是Java8的新特性,Optional是一个可以为null的...

  • 网页收藏

    一. Java基础 Java8 Stream API使用 Lambda 表达式3.Optional3.你真的会写J...

  • Optional类

    Optional类为Java8新引入的一个类,Optional是一个可以为null的容器对象,Optional中的...

  • java8 - optional

    optional 是java8的新特性,The purpose of the class is to provid...

  • 【java8新特性 简述】Optional

    Optional类是Java8为了解决null值判断问题,借鉴google guava类库的Optional类而引...

网友评论

      本文标题:java8 Optional使用误区

      本文链接:https://www.haomeiwen.com/subject/ltpegrtx.html