Java8新特性Optional详解

Java8新特性Optional

概述

由于NullPointException这个错误是我们常间的错误,为了减少这样的错误,很多是否要对对象进行判断操作,Optional类就从此出现,为了减少NullPointException,优化我们的代码判断空指针的繁锁,且提供了一些方便的对象操作方法。

Optional是一个容器对象,内部存储需要操作的对象。存储存在的对象使用Optional.of();方法,如果该方法参数为空会抛出异常,避免这个问题就可以使用Optional.ofNullable();方法能够传入null值。

当我们存入对象到Optional时,可以使用Optional.isPresent()判断是否存在对象且对象不为null。为true就能够使用Optional.get();获取对象。

使用与案例

  1. Optional提供的创建方法如下:

    • Optional.of(obj):传入非空的Object对象。如果对象为 null,将会抛出NullPointerException
    • Optional.ofNullable(obj):如果对象为 null,将会创建不包含值的 EMPTY的 Optional对象实例(new Optional<>())。
    • Optional.empty() :创建一个空的Optional对象,等同于 Optional.ofNullable(null)
  2. 获取:

    • get():获取optional实例中的对象,当optional 容器为空时报错
  3. 判断:

    • isPresent():判断optional是否为空,如果空则返回false,否则返回true

      List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6);
      Optional<List<Integer>> integers1 = Optional.of(integers);
      if (integers1.isPresent()) {
          List<Integer> integers3 = integers1.get();
          System.out.println(integers3);
      }
      // [1, 2, 3, 4, 5, 6]
      
    • ifPresent(Consumer c):如果optional不为空,则将optional中的对象传给Comsumer函数

      ifPresent()方法使用会比isPresent()方便

      List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6);
      Optional<List<Integer>> integersOpt = Optional.of(integers);
      integersOpt.ifPresent(System.out::println);
      // [1, 2, 3, 4, 5, 6]
      
    • orElse(T other):如果optional不为空,则返回optional中的对象;如果为null,则返回 other 这个默认值

      List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6);
      Optional<List<Integer>> integersOpt = Optional.of(integers);
      // 不为空
      System.out.println(integersOpt.orElse(integers));
      
      // 为空
      System.out.println(Optional.ofNullable(null).orElse("222"));
      // [1, 2, 3, 4, 5, 6]
      // 222
      
    • orElseGet(Supplier<T> other):如果optional不为空,则返回optional中的对象;如果为null,则使用Supplier函数生成默认值other

      // 不为空时就是获取封装的对象,所以主要表现为空时的情况
      // 为空就返回一个集合
      Object o = Optional.ofNullable(null).orElseGet(ArrayList::new);
      System.out.println(o);
      // []
      
    • orElseThrow(Supplier<X> exception):如果optional不为空,则返回optional中的对象;如果为null,则抛出Supplier函数生成的异常

      // 不为空时就是获取封装的对象,所以主要表现为空时的情况
      Object o = Optional.ofNullable(null).orElseThrow(() -> new RuntimeException());
      // java.lang.RuntimeException
      
  4. 过滤:

    • filter(Predicate<T> p):如果optional不为空,则执行断言函数p,如果断言函数p的结果为true,则返回原本的optional。否则返回空的optional 。

      List<Integer> integers = Arrays.asList(1, null, 3, 4, 5, 6);
      Optional<List<Integer>> integersOpt = Optional.of(integers);
      // 过滤数组索引1的值不等于null,由于现在是null,所以返回是空的Optional
      // 空的Optional调用ifPresent方法没有输出
      integersOpt.filter(integers1 -> integers1.get(1) != null)
              .ifPresent(integers1 -> System.out.println(integers1));
      
  5. 映射:

    • map(Function<T, U> mapper):如果optional不为空,则将optional中的对象映射成另外一个对象 ,并将另外一个对象存放到一个新的optional容器中。

      List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6);
      Optional<List<Integer>> integersOpt = Optional.of(integers);
      Optional<Integer> integer = integersOpt.map(integers1 -> integers1.get(1));
      System.out.println(integer.get());
      // 2
      
    • flatMap(Function< T,Optional<U>> mapper):跟上面一样,在optional不为空的情况下,通过操作将对象映射成另外一个optional。

      List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6);
      Optional<List<Integer>> integersOpt = Optional.of(integers);
      Optional<Integer> integer = integersOpt.flatMap(integers1 -> {
          Integer integer1 = integers1.get(1);
          Integer integer2 = integers.get(2);
          // 添加,作为一个Optional返回
          return Optional.ofNullable(integer1 + integer2);
      });
      System.out.println(integer.get());
      // 5
      

总结

Optional能够很好的去处理我们平时出现的NullPointException,优化我们对象的判空代码,提供一些更方便的代码去避免出现NullPointException处理数据。

参考文档

https://juejin.cn/post/6962325858145009672

https://blog.csdn.net/y_k_y/category_8596455.html

https://www.baeldung.com/java-optional

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java8中的Optional类是一个容器对象,可以包含null或非null值。它提供了一种优雅的方式来处理null值,避免了NullPointerException异常的出现。Optional类可以用于返回值、方法参数和实例变量等场景中,使代码更加简洁、清晰和安全。使用Optional类可以使代码更加健壮,减少了代码中的null检查和异常处理,提高了代码的可读性和可维护性。 ### 回答2: Optional类是Java 8中新引入的一个类,它的主要作用是在避免NullPointerException的情况下将null值返回给调用者。这个类是一个容器对象,它可以保存非空的对象,也可以保存空值(null)。 Optional类提供了通过判断一个对象是否为空来避免空指针异常的方式。它可以在代码中替换传统的null判断,这样可以更加方便地编写代码,并且可以使代码更加健壮。 在Java中,如果一个方法返回值为null,那么在调用该方法返回值的时候,会有可能抛出NullPointerException异常。而Optional类的出现可以帮助我们避免这种情况的出现,在调用Optional类的get()方法时,如果Optional类中保存的对象不为null,就会返回该对象,否则抛出一个NoSuchElementException异常。 Optional类还提供了一些方法来简化代码,比如orElse()方法,如果Optional类中保存的对象不为null,则返回该对象,否则返回指定的default值。还有ifPresent()方法,当Optional类中保存的对象不为null时,会执行指定的代码,否则不执行。 总之,Optional类是Java 8中一个很有用的类,它可以帮助我们更加方便地处理null值,避免空指针异常的出现,并且可以简化代码。但是需要注意的是,不应该滥用Optional类,因为它并不是完美的解决方案,有时候需要对null值进行特殊处理。 ### 回答3: Java 8在语言层面上增加了一个新的类:Optional。这是一个特殊的容器对象,可以包含一个null或非null的值。 Optional的目的是解决Java中的null引用问题。在Java中,如果一个变量被赋值为null,而我们试图调用该变量所对应的方法,那么就会出现NullPointerException异常。 使用Optional可以避免这种情况的发生。如果一个变量是Optional对象,那么我们必须显式地检查该对象是否包含非null的值,才能对其进行操作。这样,在我们试图调用该变量所对应的方法之前,就可以避免空指针异常的发生。 Optional类提供了很多方法来判断是否有值、获取值、如果没有值则返回默认值等等,使得我们可以更加方便地处理空值。 下面是一些Optional类提供的方法: 1. Optional.of(T value):创建一个包含非null值的Optional对象,如果T为null,则抛出NullPointerException异常。 2. Optional.ofNullable(T value):创建一个Optional对象,如果T为null,则该对象为空。 3. Optional.empty():创建一个空的Optional对象。 4. get():如果值存在,则返回该值,否则抛出异常。 5. orElse(T other):如果值存在,则返回该值,否则返回其他默认值。 6. isPresent():返回一个boolean类型的值,表示该Optional对象是否包含值。 7. ifPresent(Consumer<? super T> consumer):如果该Optional对象包含值,则对该值执行给定的操作。 在编写Java程序时,我们应该始终努力避免使用null值。使用Optional类,可以使得我们的代码更加健壮、可读性更强。但是,过多地使用Optional可能会导致代码过于冗长,所以在使用的过程中需要权衡利弊。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值