JDK8新特性——Optional工具类
程序员文章站
2022-01-15 12:00:34
...
JDK8新特性----玩转Optional工具类
1. 基本概念
Java 8 中引入了一个有趣的特性是Optional类,该工具类的引入主要是为了解决空指针异常(NullPointException)。本质上,这是一个包含有可选值的包装类,意味着类本身亦可以有值也可以为Null。
2.方法
方法 | 描述 |
---|---|
of() | 把指定的值封装成Optional对象并返回,如果参数为null,贼会抛出空指针异常(不可以传null值) |
ofNullable() | 把指定的值封装为Optional对象并返回,如果参数为null,则创建一个空的Optional对象(可以传null值) |
empty() | 创建一个空的Optional对象 |
get() | 如果创建的Optional中有值存在,则返回此值,否则抛出NoSuchElementException |
orElse() | 如果创建的Optional中有值存在,则返回此值,否则返回一个默认值(即返回传入的参数) |
orElseGet() | 如果创建的Optional中有值存在,则返回此值,否则返回一个由Supplier接口(参数)生成的值 |
orElseThrow() | 如果创建的Optional中有值存在,则返回此值,否则抛出一个由指定的Supplier(参数)接口生成的异常 |
filter() | 如果创建的Optional中的值满足filter中的条件,则返回包含该值的Optional对象,否则返回一个空的Optional对象 |
map() | 如果创建的Optional中有值存在,则应用提供的映射函数,如果结果不为空,则封装成Optional返回,否则返回一个空的Optional |
flagMap() | 如果创建的Optional中的值存在,就对该值执行提供的Function函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象 |
isPresent() | 如果创建的Optional中的值存在,返回true,否则返回false |
ifPresent() | 如果创建的Optional中的值存在,则执行该方法的调用,否则什么也不做 |
3.方法详解
-
of() 和 ofNullable()
// 传入null值会抛出异常,所以参数必须确保非空 Optional<String> op = Optional.of("Ye")
// 为指定的值创建Optional对象,不管所传入的值为null不为null,创建的时候都不会报错 Optional<String> nullOptional = Optional.ofNullable(null); Optional<String> nullOptional = Optional.ofNullable("Ye");
当我们明确参数不为null时我们使用of(),否则我们应该使用ofNullable()来摆脱空指针异常都影响。
-
empty
// 创建一个为空的Optional对象 Optional<String> emptyOptional = Optional.empty();
-
get() | orElse() | orElseGet()
-
get()
// 获取Optional对象中封装的值 String s = Optional.of("Value").get() // 当Optional对象封装的值为空的时候会抛出异常,所以一般可结合isPresent()使用 Optional<String> op = Optional.ofNullable("Ye") if (op.isPresent()) { String name = op.get() }
-
orElse() 和 orElseGet()
// 当Optional对象中值为null时返回默认值,避免空指针异常的可能 String name = Optional.ofNullable(name).ofElse("Ye")
// 这个方法会在有值的时候返回值,如果没有值,它会执行作为参数传入的 Supplier(供应者) 函数式接口,并将返回其执行结果 User result = Optional.ofNullable(user).orElseGet( () -> user2);
当参数都为一个方法的时候,如果Optional中封装的值为null,则两方法无差异;当Optional封装的值不为null的时候,orElse()仍然会执行参数中方法,orElseGet()则不会。这个区别使得两者在性能上有所差异。
-
-
orElseThrow()
// 当Optional封装值为空的时候,会抛出你指定的异常 User result = Optional.ofNullable(user).orElseThrow( () -> new IllegalArgumentException());
这个方法用于在对象为null时抛出我们想要的异常而非空指针,方便于定位和处理问题
-
filter()
// filter() 接受一个 Predicate 参数,返回测试结果为 true 的值。如果测试结果为 false,会返回一个空的 Optional。 Optional<String> op = Optional.of(user).filter(() -> String.isNotEmpty(user.name)) // 由于该方法返回的是Optional对象,这使得我们可以在一行代码中过滤符合指定条件的数据进行处理 // 过滤出具有权限的user(或user为null也会返回true的方法),获取他们的值,如果为null则返回新user User user = Optional.ofNullable(user).filter(u -> u.permission()).orElseGet(creatNewUser())
-
map() 和 flatMap()
// 如果创建的Optional中的值存在,对该值进行操作返回结果(一般用来转换值或取得其中属性),返回的值为Optional,可执行链式编程(后接orElse()等) String userName = Optional.ofNullable(user).map(user -> user.getName()).orElse("姓名未填写")
一般利用该方法进行封装值的转换和属性提取,避免了只能对原始类型Optional的操作和获取。
// flatMap() 与 map()方法类似,但是参数Predicate返回的值必须是Optional,返回结果也不会进行封装 String userName = Optional.ofNullable(user).flatMap(user -> Optional.ofNullable(user.getName()).orElse("姓名未填写")
-
isPresent() 和 ifPresent()
// isPresent()可用来对Optional判空,在Optation内部代码中实现判断逻辑 Optional.ofNullable.isPresent() // ifPresent()用于简化if结合判空的使用,内部传入Predicate参数,只进行内部处理没有返回值 Optional.ofNullable(user).ifPresent(() -> user = new User())
上一篇: canvas验证码
下一篇: JavaScript时间线