栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java函数式编程(5) - Optional

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java函数式编程(5) - Optional

Java函数式编程(5) - Optional 1.概述

java8里提供的Optional类,简单来讲是个容器类,可以放任意类型对象,以及null,是在java.util包下的一个用于代替null的一个工具类。它的存在是为了解决空指针异常的问题,通过提供的isPresent()方法对放入的值进行是否存在的判断,以及一系列构建、过滤、值映射方法,和有备选方案的取值方法。

以往的编写代码中:

Person person =new Person();
      if(person != null){
          System.out.println(person.getPersonName());
      }

过多的判断使代码显得臃肿不堪,所以在JDK8中引入了Optional,用于更优雅的规避空指针,很多函数式编程中也引入了Optional,所以有必要学习一下

1.1什么时候使用
  • 对于调用一个可能得到null值的方法得到的结果,通常需要使用if(null != xx){},代码很长,并且容易忘记,使用Optional并结合函数式编程风格使用后,可以用简短代码达到同样效果
  • 对于提供给外部使用的返回值有可能为空的接口,返回类型可以使用Optional来定义,提醒使用方进行相应检查
2. 使用 2.1 创建对象

Optional就像是包装类,我们可以把具体的数据封装到Optional内部,在使用Optional内部方法进行操作数据。

2.1.1 获取对象 empty( )、of( )、ofNullable( )

查看下源码:

empty:创建一个空的Optional

of:参数不能空

说明:value不可以为null,否则会报空指针

ofNullable(推荐使用)

		 Person person =new Person();
        Optional person1 = Optional.ofNullable(person);
        person1.ifPresent(p -> System.out.println(p.getPersonName()));

说明: 构建一个value的Optional对象

2.2 安全消费 2.2.1 ifPresent()

说明: ifPresent传入一段lambda,当value!=null时,执行里面的逻辑;value==null时,啥都不干;

2.3 获取值 2.3.1 get(不推荐)

源代码:

说明: 意思就是Optional中没有值 get的时候会抛出异常,所以不推荐使用。

2.3.2 orElseGet

Optional有值的话返回该值,没有值则会根据自己的传入指定一个默认值
源代码:

 		Person person =new Person();
        person =null;
        Optional person1 = Optional.ofNullable(person);
        //new Person 为指定的默认值
        Person person2 = person1.orElseGet(() -> new Person());
        System.out.println(person2.getPersonName());

输出结果:

说明:即使对象是null 也不会有异常,会返回一个默认值

2.3.3 orElseThrow

如果存在,则返回包含的值,否则抛出由提供的供应商创建的异常。

源代码:

 Person person =new Person();
        person =null;
        Optional person1 = Optional.ofNullable(person);
        Person person2 = person1.orElseThrow(() -> new RuntimeException("数据不存在"));
        System.out.println(person2.getPersonName());

输出结果:

说明: 有值返回值,没值抛异常,可用于统一异常管理。

2.4 过滤 2.4.1 filter

过滤数据

Person person =new Person();
        person.setPersonName("zhangsan");
        Optional person1 = Optional.ofNullable(person);
        person1.filter(p -> p.getPersonName().startsWith("zhang"))
                .ifPresent(p-> System.out.println(p.getPersonName()));

输出结果:

说明: 如果p的结果为true,则返回原本的optional,否则返回空的optional 。 p -> p.getPersonName() 为空的会报空指针

2.4.2 isPresent

判断optional是否为空,如果空则返回false,否则返回true

2.5 数据转换 2.6 map

如果optional不为空,则将optional中的对象 t 映射成另外一个对象 u,并将 u 存放到一个新的optional容器中。

 Person person =new Person("zhangsan",
                Arrays.asList(new Book("1"),
                        new Book("2"),
                        new Book("3")));

        Optional> books = Optional.ofNullable(person)
                .map(person1 -> person1.getBooks());

        books.ifPresent(s->s.stream().forEach(t-> System.out.println(t.getBookName())));

输出结果:

说明: 以上例子是将对象映射成list对象重新封装进optional中,我们就可以对这个新的optional操作消费了

总结

个人理解,在日常开发中对其使用最多就是处理对象的空指针情况。其他的使用较少

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/986680.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号