(详细+示例)JDK8新特性四:Optional类的学习

目录

第一篇:JDK8新特性一:引入介绍
第二篇:JDK8新特性二:Lambda表达式引入介绍
第三篇:JDK8新特性二:Lambda表达式规范和语法
第四篇:JDK8新特性二:方法引入详述
第五篇:JDK8新特性二:foreach、排序、线程调用简单示例
第六篇:JDK8新特性三:Stream流+常见方法演示
第七篇:JDK8新特性四:Optional类的学习

四 Optional

  • Optional类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象
  • Optional是一个容器,可以保存类型T的值,或者仅仅保存null。Optional提供了空值检测方式,很好地解决了空指针异常。

1 创建Optional

  • 方法

    • Optional.ofNullable()
      • 可以传递空对象
      • image-20210809090423363
    • Optional.of()
      • 不可以传递空对象,会直接抛出NullPointerException异常
    • get()
      • 获取值,如果值为空,会抛出NoSuchElementException异常
      • image-20210809090517021
    • isPresent()
      • 判断值是否不等于null,不等于null返回true,否则为false
      • image-20210809090632243
  • 示例代码

    Integer a = 1;
    Integer b = null;
    Optional<Integer> optional1 = Optional.ofNullable(a);
    System.out.println(optional1.get());
    Optional<Integer> optional2 = Optional.ofNullable(b);
    // 如果值为null,调用get()方法会抛出new NoSuchElementException("No value present")
    //System.out.println(optional2.get());
    System.out.println(optional2.isPresent());
    
    Optional<Integer> optional3 = Optional.of(a);
    System.out.println(optional3.get());
    // Optional.of()方法无法接收null对象
    //Optional<Integer> optional4 = Optional.of(b);
    //System.out.println(optional4.get());
    

2 给空参数设置默认值

  • 方法

    • orElse()
      • 当值为不为null的时候,返回原值,否则返回orElse中给定的其他值
      • image-20210809090748976
  • 示例代码

    Integer a = 1;
    Integer b = null;
    // 输出1
    System.out.println(Optional.ofNullable(a).orElse(null));
    // 输出null
    System.out.println(Optional.ofNullable(b).orElse(null));
    

3 参数过滤

  • 方法

    • filter()
      • 如果值存在并且能够匹配所给定的断言,就会返回一个Optional对象,否则返回一个空的Optional对象
      • image-20210809103611119
  • 示例代码

    List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
            // 判断是否含有3,如果有则返回整个List,否则返回null
            List<Integer> result = Optional.ofNullable(integerList).filter(f -> f.contains(3)).orElse(null);
            System.out.println(result);
    

4 结合Lambda表达式案例

4.1 案例1-对于String
  • 示例代码

    // 优化前
    String name = "meitian";
    if (name != null) {
      logger.info(name);
    }
    // 优化后
    Optional<String> optionalName = Optional.ofNullable(name);
    // 判断值是否为null,不为null才输出
    optionalName.ifPresent(System.out::println);
    
4.2 案例2-实体类非空检验
  • 实体

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class TestEntity {
    
        private String id;
        private String name;
    }
    
  • 示例代码

    private static TestEntity testEntity = null;
    
    public static void main(String[] args) {
      TestEntity testEntity = TestTwo.getEntity();
      System.out.println(testEntity);
    }
    
    private static TestEntity getEntity() {
      // 优化前
      //if (testEntity == null) {
      //    return creteEntity();
      //}
      //return testEntity;
      // 优化后
      return Optional.ofNullable(testEntity).orElseGet(() -> creteEntity());
    }
    
    private static TestEntity creteEntity() {
      return new TestEntity("1", "Tom");
    }
    
  • 方法

    • orElseGet()
      • 如果值不为null,则直接返回,否则会返回Supplier匿名内部类的调用,通过调用get() 方法返回值
4.3 优化3
  • 实体

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class TestEntity {
    
      private String id;
      private String name;
    }
    
  • 示例代码

    // 优化前
    TestEntity order = new TestEntity("1", "Tom");
    //if (order != null) {
    //    String orderName = order.getName();
    //    if (orderName != null) {
    //        return orderName.toLowerCase();
    //    }
    //}
    //return null;
    //优化后
    //return Optional.ofNullable(order).map(orderEntity -> {
    //    return orderEntity.getName();
    //}).map(name -> {
    //    return name.toLowerCase();
    //}).orElse(null);
    //Optional<TestEntity> order1 = Optional.ofNullable(order);
    //Optional<String> s = order1.map(TestEntity::getName);
    //Optional<String> s1 = s.map(String::toLowerCase);
    //String s2 = s1.orElse(null);
    //System.out.println(s2);
    return Optional.ofNullable(order).map(TestEntity::getName).map(String::toLowerCase).orElse(null);
    
  • 方法

    • map()
      • 如果值存在,就继续使用映射函数对值进行处理,当结果不为null的时候,会返回一个Optional包装的对象,否则返回空的Optional

- 方法

 - map()
   - 如果值存在,就继续使用映射函数对值进行处理,当结果不为null的时候,会返回一个Optional包装的对象,否则返回空的Optional



















































































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值