• 学习笔记 Optional


    今天学习到的一种新的防止空指针的方法
    下面是我自己写的一个例子:
    节省空间,bean的get set 省略...

    /**
    * 类目
    * @author 唐
    * @date 2018/5/6 17:45
    * @Package com.imooc.dataobject
    */
    public class ProductCategory {
    /** 类目id .*/
    private Integer categoryId;
    /** 类目名称 .*/
    private String categoryName;
    /** 类目编号 .*/
    private Integer categoryType;

    private ProductCategory productCategory;
    }


    ProductCategory productCategory=null;
    Optional<ProductCategory> optional = Optional.ofNullable(productCategory);
    System.out.println(optional.map(p -> p.getProductCategory()).map(pp -> pp.getCategoryName())
    .orElse(null));

    这个例子可以看到我第一次调用的时候
    productCategory=null
    这个对象中还有一个自身对象的属性,我在第一次调用为空的时候,没有报错最后返回了一个null
    这是jdk1.8才有的方法Optional

    Optional的3种构造方法
    • Optional.of(obj) 它要求传入的 obj 不能是 null 值的, 否则还没开始进入角色就倒在了 NullPointerException 异常上了.
    • Optional.ofNullable(obj)它以一种智能的, 宽容的方式来构造一个 Optional 实例. 来者不拒, 传 null 进到就得到 Optional.empty() , 非 null 就调用 Optional.of(obj) .
    • Optional.empty() 返回一个空的实例

    还有些其他方法:
    下面的是我在网上学习找到的
    1. isPresent()  //判断是否为空
    2. get()  //获取对象,如上例中的ProductCategory对象
    3. public<U> Optional<U> map(Function<? super T, ? extends U> mapper) //可以判断管理对象属性是否为空的
    4. public T orElse(T other)//出现意料之中的问题后做出的弥补,像语句中的else
    5. public T orElseGet(Supplier<? extends T> other)
    6. public void ifPresent(Consumer<? super T> consumer)
    7. public Optional<T> filter(Predicate<? super T> predicate)
    8. public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)
    9. public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X

     存在即返回, 无则提供默认值

    return user.orElse(null);  //而不是 return user.isPresent() ? user.get() : null;
    return user.orElse(UNKNOWN_USER);

     存在即返回, 无则由函数来产生

    return user.orElseGet(() -> fetchAUserFromDatabase()); //而不要 return user.isPresent() ? user: fetchAUserFromDatabase();

      map 函数隆重登场

      当 user.isPresent() 为真, 获得它关联的 orders , 为假则返回一个空集合时, 我们用上面的 orElse , orElseGet 方法都乏力时, 那原本就是 map 函数的责任, 我们可以这样一行

      return user.map(u -> u.getOrders()).orElse(Collections.emptyList())
    
    //上面避免了我们类似 Java 8 之前的做法
    if(user.isPresent()) {
      return user.get().getOrders();
    } else {
      return Collections.emptyList();
    }

      map 是可能无限级联的, 比如再深一层, 获得用户名的大写形式

      return user.map(u -> u.getUsername())
                 .map(name -> name.toUpperCase())
                 .orElse(null);
     
     
  • 相关阅读:
    iOS开发学习之NSFetchedResultsController
    iOS开发学习之Core Data
    iOS开发学习之MapKit
    iOS学习之CoreLocation相关知识
    制作LaunchImage的简单方法
    iOS学习之table view controller、table view cell
    iOS学习之NSKeyedArchiver、NSKeyedUnarchiver归档
    【MM 】委外加工退货
    【SAP Workflow】相关英语专业术语
    【MM】Purchasing Account Management---待完善
  • 原文地址:https://www.cnblogs.com/tangyb/p/8999941.html
Copyright © 2020-2023  润新知