jdk1.8optional的使用-创新互联

前言

成都创新互联公司于2013年创立,是专业互联网技术服务公司,拥有项目做网站、成都做网站网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元莆田做网站,已为上家服务,为莆田各地企业和个人服务,联系电话:18982081108

在前面简单介绍了stream 流的使用,这篇博客主要介绍optional类的使用。

知道 Google 的 Guava 的同学,一定知道jdk的很多都是借鉴guava里面的思想来进行升级的,optional就是其中之一,早在java 6时,Guava 就提供了 Optional > 的实现。

言归正传,开始干

NullPointerException 是编码过程中必须要处理的防御式检查,我们可能用if(null != user) 或者 Objects.isNull(user)等方式处理,再jdk1.8之后,你可以优雅的处理这个问题

定义

Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

Optional 类的引入很好的解决空指针异常。

方法实例演示

例举几个常用的函数,然后进行实际使用分析

of

//创建一个值为张三的String类型的Optional

Optional ofOptional = Optional.of("李四");

//如果我们用of方法创建Optional对象时,所传入的值为null,则抛出NullPointerException

Optional nullOptional = Optional.of(null);

of的用法实际上就是静态工厂方法,示例如下:

@Data

public class Card {

private String name;

private String number;

private Card() {}

private Card(String name,String number) {

this.name = name;

this.number = number;

}

public static Card of() {

return new Card();

}

public static Card of(String name,String number) {

return new Card(name,number);

}

}

目前,静态工厂方法比较流行,如果目标类类不需要子类化,非常推荐使用这种方式。

get

如果创建的Optional对象中有值存在则返回此值,如果没有值存在,则会抛出

NoSuchElementException异常

ofNullable

//为指定的值创建Optional对象,不管所传入的值为null不为null,创建的时候都不会报错

Optional nullOptional = Optional.ofNullable(null);

Optional noNullOptional = Optional.ofNullable("李四");

System.out.println(nullOptional.get());//抛出异常 NoSuchElementException: No value present

System.out.println(noNullOptional.get());//李四

empty

//创建一个空的String类型的Optional对象

Optional emptyOptional = Optional.empty();

System.out.println(emptyOptional .get());//抛出异常 NoSuchElementException

orElse

存在就返回该值,不存在就返回默认值

Optional stringOptional = Optional.of("张三");

System.out.println(stringOptional.orElse("zhangsan"));//张三

Optional emptyOptional = Optional.empty();

System.out.println(emptyOptional.orElse("李四"));//李四

orElseThrow

如果创建的Optional中有值存在,则返回此值,否则抛出一个由指定的Supplier接口生成的异常

Optional stringOptional = Optional.of("张三");

System.out.println(stringOptional.orElseThrow(Exception::new));

map郑州妇科医院 http://www.zykdfkyy.com/

如果创建的Optional中的值存在,对该值执行提供的Function函数调用

map方法执行传入的lambda表达式参数对Optional实例的值进行修改,修改后的返回值仍然是一个Optional对象

Optional stringOptional = Optional.of("张三");

System.out.println(stringOptional.map(e -> e.toUpperCase()).orElse("不能为空"));

stringOptional = Optional.empty();

System.out.println(stringOptional.map(e -> e.toUpperCase()).orElse("不能为空"));

filter

如果创建的Optional中的值满足filter中的条件,则返回包含该值的Optional对象,否则返回一个空的Optional对象

Optional stringOptional = Optional.of("张三");

System.out.println(stringOptional.filter(e -> e.equals("张三")));//Optional[张三]

System.out.println(stringOptional.filter(e -> !e.equals("张三")).orElse("李四"));//张三

stringOptional = Optional.empty();

System.out.println(stringOptional.filter(e -> e.equals("张三")).orElse("李四"));//李四

flagMap

flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回

值必须是Optional,map方法的mapping函数返回值可以是任何类型T

Optional stringOptional = Optional.of("张三");

System.out.println(stringOptional.flatMap(e -> Optional.of("李四")).orElse("不能为空"));

可能看到这儿之后并没有感觉到多么好用,该写的判断还是要写,咱们继续

实际使用

Person p = new Person("李四",11);//如果 p = null 抛出"年龄不能为空"异常

Integer orElseThrow = Optional.ofNullable(p)

.map(s -> s.getAge())//返回参数为年龄的function

.map(b ->b + 1)//返回参数为年龄+ 1 的function

.filter(m -> m.compareTo(10) == 1)//如果年龄大于10则保留,小于10则过滤掉

.orElseThrow(() -> new Exception("年龄不合法"));//如果为空则抛出该异常

System.out.println(orElseThrow);//12

这种用法可以对单条或多条(配合foreach)能简化大量代码和判断,通过抛出统一异常,使用异常拦截器进行拦截,统一处理,能很大程度上提高开发效率和代码阅读性。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前标题:jdk1.8optional的使用-创新互联
本文网址:http://ybzwz.com/article/hegch.html