Optional源码解析与实践( 三 )

  • result = optional2.orElse(value3);
  • System.out.println("optional2执行orElse处理后的值是"+result);
  • result = optional1.orElseGet(()-> new Integer(-1));
  • System.out.println("optional1执行orElseGet处理后的值是"+result);
  • result = optional2.orElseGet(()-> new Integer(-1));
  • System.out.println("optional2执行orElseGet处理后的值是"+result);
  • try {
  • result = optional1.orElseThrow (()-> new RuntimeException("值是空的"));
  • System.out.println("optional1执行orElseThrow处理后的值是"+result);
  • }catch (Exception e){
  • System.out.println("optional1的orElseThrow抛出异常:"+e.getMessage());
  • }
  • try {
  • result = optional2.orElseThrow (()-> new RuntimeException("值是空的"));
  • System.out.println("optional2执行orElseThrow处理后的值是"+result);
  • }catch (Exception e){
  • System.out.println("optional2的orElseThrow抛出异常:"+e.getMessage());
  • 4)运行结果
    Optional源码解析与实践

    文章插图
    2.3.5 过滤方法1)源码
    1. public Optional<T> filter(Predicate<? super T> predicate) {
    2. Objects.requireNonNull(predicate);
    3. if (!isPresent())
    4. return this;
    5. else
    6. return predicate.test(value) ? this : empty();
    7. }
    2)方法说明filter(Predicate p): 如果optional不为空,则执行Predicate p,如果p的结果为true , 则返回原本的optional,否则返回空的optional
    3)测试代码
    1. public static void main(String[] args) {
    2. Integer value1 = 5;
    3. Integer value2 = 6;
    4. Optional<Integer> optional1 = Optional.ofNullable(value1);
    5. Optional<Integer> optional2 = Optional.of(value2);
    6. Optional<Integer> result =optional1.filter(t->t > 5);
    7. System.out.println("optional1的filter后的值:"+result);
    8. result =optional2.filter(t->t > 5);
    9. System.out.println("optional2的filter后的值:"+result);
    4)运行结果
    Optional源码解析与实践

    文章插图
    2.3.6 映射方法1)源码
    1. public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
    2. Objects.requireNonNull(mapper);
    3. if (!isPresent())
    4. return empty();
    5. else {
    6. return Optional.ofNullable(mapper.apply(value));
    7. }
    8. }
    9. public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
    10. Objects.requireNonNull(mapper);
    11. if (!isPresent())
    12. return empty();
    13. else {
    14. return Objects.requireNonNull(mapper.apply(value));
    15. }
    16. }
    2)方法说明
    • map(Function<t, u=""> mapper): 如果存在一个值,则对其应用提供的映射函数 , 如果结果非空,则返回描述结果的Optional 。否则返回一个空的Optional 。
    • flatMap(Function< T,Optional> mapper): 如果有值,则对其应用提供的可选映射函数,返回结果 , 否则返回空的可选函数 。这个方法类似于map(Function),但是提供的映射器的结果已经是一个可选的 , 如果调用,flatMap不会用额外的可选的包装它 。
    • 区别:map会自动将u放到optional中,而flatMap则需要手动给u创建一个optional
    3)测试代码
    1. public static void main(String[] args) {
    2. User user1 = null;
    3. User user2 = new User("user2名字",19);
    4. Optional<User> optional1 = Optional.ofNullable(user1);
    5. Optional<User> optional2 = Optional.of(user2);
    6. System.out.println("=========map==========");
    7. System.out.println("optional1的map前的值:"+optional1);
    8. Optional<String> result =optional1.map(t->t.getName());
    9. System.out.println("optional1的map后的值:"+result);
    10. 推荐阅读