Java8新特性Optional常用方法

 更新时间:2024年02月04日 10:57:52   作者:Mine4everYoung  
optional类是Java8新增加的一个对象容器,主要的功能有对象的创建、获取、判断、过滤,映射等,下面这篇文章主要给大家介绍了关于Java8新特性Optional常用方法的相关资料,需要的朋友可以参考下

前言

optional 是Java8 util包中的类,我们为了避免空指针异常(NullPointerException),经常要写好多类似if(a!=null){...},optional就是为了解决这些问题,让代码看起来更nb。

(一)Optional.ofNullable(e).ifPresent()

此方法是当传入的对象为不为空(e!=null)时,才会执行ifPresent()中的代码,e==null时什么都不会执行,也不会抛异常。

//空对象 不会执行
Optional.ofNullable(null).ifPresent(e -> {
    System.out.println("空");
});
//空字符串时会执行 
Optional.ofNullable("").ifPresent(e -> {
    System.out.println("空字符串");
});
//空格 也会执行
Optional.ofNullable(" ").ifPresent(e -> {
   System.out.println("空格");
});

输出:

空字符串
空格 

(二)Optional.ofNullable(e).orElse()

orElse()方法,当 Optional 中有值则将其返回,为空时返回 orElse 方法传入的参数。

此方法可以替代三目运算符使用。

//为空时返回orElse中的值
System.out.println(Optional.ofNullable(null).orElse("默认值"));
//输出 默认值

//不为空时
System.out.println(Optional.ofNullable("我不是空").orElse("默认值"));
//输出 我不是空

(三)Optional.ofNullable(e).orElseGet()

orElseGet方法,当Optional 中值为空时,orElseGet与orElse效果是一样的。当Optional 中有值时,两者才有区别,上代码。

//当参数为空时
String a = (String) Optional.ofNullable(null).orElse(get("a"));
System.out.println("a="+a);
String b = (String) Optional.ofNullable(null).orElseGet(() -> get("b"));
System.out.println("b="+b);

输出
a:我执行了
a=a
b:我执行了
b=b

//参数不为空是
String c = Optional.ofNullable("notnull").orElse(get("c"));
System.out.println("c="+c);
String d =  Optional.ofNullable("我不是空").orElseGet(() -> get("d"));
System.out.println("d="+d);

输出

c:我执行了
c=notnull
(此处没有 执行)
d=我不是空

private static String get(String s) {
       System.out.println(s + ":我执行了");
        return s;
 }

可以看到,当参数不为空时,orElseGet中的方法是没有执行的。

(四)Optional.ofNullable(e).filter()

filter个方法通过传入的定条件对Optional实例的值进行过滤,它可以配合着.ifPresent()方法和.orElse()使用

Optional.ofNullable("notnull").filter(t -> "notnull".equals(t)).ifPresent(t2 -> System.out.println("成立时我才会执行"));

输出
成立时我才会执行

String a=Optional.ofNullable("notnull").filter(t -> "null".equals(t)).orElse(("不成立时我才会执行"));
System.out.println("a="+a);

String b=Optional.ofNullable("notnull").filter(t -> "notnull".equals(t)).orElse(("不成立时我才会执行"));
System.out.println("b="+b);

输出
a=不成立时我才会执行
b=notnull

补充:Optional的用法代码案例

示例1:

String s = Optional.ofNullable(user)
                   .map(o -> o.getUsername())
                   .orElseGet(() -> { return "李四";});

用法说明:Optional.ofNullable(user)是判断user是否为null,如果为null,则不会执行map(o -> o.getUsername()),直接执行orElseGet(() -> { return “李四”;})方法。如果不为null,则只执行map(o -> o.getName())方法。
还有一个跟orElseGet()类似的方法:orElse(),orElse()方法不管ofNullable()值是否为null,都会执行orElse()的代码,而orElseGet()方法只有在ofNullable()值为null时才会执行传入的函数。

示例2:

有如下代码,需要获得Test2中的Info信息,但是参数为Test4,我们要一层层的申请,每一层都获得的对象都可能是空,最后的代码看起来就像这样。

 public String testSimple(Test4 test) {
    if (test == null) {
       return "";
    }
    if (test.getTest3() == null) {
       return "";
    }
    if (test.getTest3().getTest2() == null) {
       return "";
    }
    if (test.getTest3().getTest2().getInfo() == null) {
       return "";
    }
    return test.getTest3().getTest2().getInfo();
}

但是使用Optional后,整个就都不一样了。

    public String testOptional(Test test) {
       return Optional.ofNullable(test)
           .flatMap(Test::getTest3)
           .flatMap(Test3::getTest2)
           .map(Test2::getInfo)
           .orElse("");
    }

示例3:

Optional.ofNullable(user).ifPresent(o -> o.setUsername("李四"));

如果user不为null,执行ifPresent()方法,否则不执行ifPresent()方法,这与orElseGet()用法刚好相反。

示例4:

.查询用户信息,如果没有则新建用户,并将新建的用户信息返回

    User user = Optional.ofNullable(
        baseMapper.selectOne(
            new QueryWrapper<User>()
                .lambda()
                .eq(User::getAlipayUserId, result.getUserId())
                .eq(User::getDelFlag, false)
    )).orElseGet(()-> {
      User newUser = User.builder()
          .relation(User.Relation.Unrelated)
          .authentication(false)
          .status(User.Status.Normal)
          .updateUserId(User.DEFAULT_USER_ID)
          .createUserId(User.DEFAULT_USER_ID)
          .roles(User.ROLE_USER_INFO)
          .alipayUserId(alipayUserId)
          .build();
      this.save(newUser);
      return newUser;
    });

示:5:

Optional.ofNullable(
        baseMapper.selectOne(new QueryWrapper<User>().lambda().eq(User::getMobileNumber, phone))
    ).filter(user -> {
      if (StringUtils.isNotBlank(user.getAlipayUserId()) && user.getAlipayUserId().equals(userId)) {
        return true;
      }
      baseMapper.physicalDeleteByUserId(userId);
      baseMapper.update(new User(),
          new UpdateWrapper<User>().lambda()
              .set(User::getAlipayUserId, userId)
              .set(User::getUpdateTime, LocalDateTime.now())
              .eq(User::getMobileNumber, phone));
      return true;
    }).orElseGet(() -> {
      baseMapper.update(new User(),
          new UpdateWrapper<User>().lambda()
              .set(User::getMobileNumber, phone)
              .set(User::getUpdateTime, LocalDateTime.now())
              .eq(User::getAlipayUserId, userId));
      return null;
});

filter()方法的用法:只有Optional.ofNullable()不为空时,才会执行filter()方法,否则会直接执行orElseGet()方法。当执行filter()方法时,如果方法内返回true,则直接将Optional.ofNullable()的对象返回,如果方法内返回false,则继续执行orElseGet()方法。

总结 

到此这篇关于Java8新特性Optional常用方法的文章就介绍到这了,更多相关Optional常用方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java身份证合法性校验并提取身份证有效信息

    java身份证合法性校验并提取身份证有效信息

    这篇文章主要为大家详细介绍了java身份证合法性校验,并获取并根据身份证号提取身份证相关信息,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • java 实现下压栈的操作(能动态调整数组大小)

    java 实现下压栈的操作(能动态调整数组大小)

    这篇文章主要介绍了java 实现下压栈的操作(能动态调整数组大小),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • springboot2.0整合logback日志的详细代码

    springboot2.0整合logback日志的详细代码

    这篇文章主要介绍了springboot2.0整合logback日志的应用场景分析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • logback-spring.xml的配置及示例详解(直接复制粘贴可用)

    logback-spring.xml的配置及示例详解(直接复制粘贴可用)

    在使用logback作为日志框架时,可以创建一个名为logback-spring.xml的配置文件来自定义日志输出的格式和方式,下面这篇文章主要给大家介绍了关于logback-spring.xml的配置及示例详解的相关资料,文中的代码直接复制粘贴可用,需要的朋友可以参考下
    2024-01-01
  • Maven的安装+配置本地仓库路径方式

    Maven的安装+配置本地仓库路径方式

    这篇文章主要介绍了Maven的安装+配置本地仓库路径方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • Windows系统下如何查找JDK的安装路径

    Windows系统下如何查找JDK的安装路径

    这篇文章主要介绍了Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看环境变量,需要的朋友可以参考下
    2025-03-03
  • Java中的线程安全及其实现方式

    Java中的线程安全及其实现方式

    在多线程编程中,线程安全是一个非常重要的概念,线程安全指的是当多个线程同时访问某个共享资源时,程序的行为仍然是正确的,不会出现数据不一致或其他不可预见的错误,本文将详细介绍什么是线程安全,以及如何在Java中实现线程安全,需要的朋友可以参考下
    2025-02-02
  • 关于Dubbo初始问题

    关于Dubbo初始问题

    这篇文章主要介绍了关于Dubbo初始问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Maven仓库加载顺序的实例解析

    Maven仓库加载顺序的实例解析

    Maven仓库一般分为本地仓库和远程仓库。那么在实际开发中,在配置了多个仓库的情况下,他们之间的加载访问顺序是怎么样的呢,本文就详细的来介绍一下
    2021-12-12
  • Java的延迟队列之DelayQueue解读

    Java的延迟队列之DelayQueue解读

    这篇文章主要介绍了Java的延迟队列之DelayQueue解读,DelayQueue的底层存储是一个PriorityQueue,PriorityQueue是一个可排序的Queue,其中的元素必须实现Comparable接口的compareTo方法,需要的朋友可以参考下
    2023-12-12

最新评论