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)
  1. 获取:

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

    • 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
      
  3. 过滤:

    • 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));
      
  4. 映射:

    • 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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容