Java Optional类说明及使用(JDK8)
程序员文章站
2022-03-04 11:34:11
...
Optional类是JDK8提供的类,用于防止出现空指针异常。本篇旨在对该类进行说明及具体使用方式列举。
一、序言
Option在使用中主要是为了简化传统Java的if else形式对null情况进行判断。既然为了简化代码编写,就必须要提到JDK8的Lambda表达式。Lambda表达式是建立在函数式接口(函数式接口由@FunctionalInterface
注解标识,接口有且仅有一个抽象方法)上的,具有()->{}的形式的函数表达式,有点类似于JavaScript中ES6的箭头函数形式。其使用场景举例如下:
//遍历Map集合
public static void main(String[] args) {
Map<String, String> hashMap = new HashMap<>();
hashMap.put("First", "111");
hashMap.put("Second", "222");
// 使用增强for的方式来遍历hashMap
for (Map.Entry<String, String> entry : hashMap.entrySet()) {
System.out.println(entry.getKey()+":"+entry.getValue());
}
// 使用Lambda表达式的方式来遍历hashMap
hashMap.forEach((s, s2) -> System.out.println(s + ":" + s2));
}
即通过简洁的函数体形式减少了代码量。
二、Optional类
2.1 构造方式
Optional类方法结构图如下:
类方法中构建Optional容器的方式有ofNullable、of两种:
// 创建出Optional容器,并将对象(value)装载到Optional容器中。
// 传入的value如果为null,抛出异常(调用的是Optional(T value)方法)
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
// 创建出Optional容器,并将对象(value)装载到Optional容器中。
// 传入的value可以为null,如果为null,返回一个没有装载对象的Optional对象
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
其中:
-
调用ofNullable()方法,传入的对象可以为null
-
调用of()方法,传入的对象不可以为null,否则抛出NullPointerException
2.2 简单使用
Optional常用的方法如下:
// 得到容器中的对象,如果为null就抛出异常
public T get() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
// 判断容器中的对象是否为null
public boolean isPresent() {
return value != null;
}
// 如果容器中的对象存在,则返回。否则返回传递进来的参数
public T orElse(T other) {
return value != null ? value : other;
}
测试用法示例如下:
public static void main(String[] args) {
User user = new User();//类定义省略,包含name和id
User user1 = null;
Optional<User> op1 = Optional.ofNullable(user);
System.out.println(op1.isPresent());//true
System.out.println(op1.get());//User<name=null,id=null>
System.out.println(op1.orElse(user1));//User<name=null,id=null>
Optional<User> op1 = Optional.ofNullable(user1);
System.out.println(op1.isPresent());//false
System.out.println(op1.orElse(user));//User<name=null,id=null>
System.out.println(op1.get());//抛出异常
}
对于一般情况而言,使用Optional判断方式常见为以下代码:
public String present(User user){
Optional<User> optional=Optional.ofNullable(User);
if(optional.isPresent){
return optional.get().getName();
}else{
return "Unknown";
}
}
但其实相比于传统的null判断方式代码量并未减少,由此引出下一节:ifPresent
三、ifPresent
3.1 简单用法
ifPresent简单用法如下:
public static void main(String[] args) {
User user = new User();
user.setName("Tom");
test(user);
}
public static void test(User user) {
Optional<User> optional = Optional.ofNullable(user);
// 如果存在user,则打印user的name
optional.ifPresent((value) -> System.out.println(value.getName()));
// 旧写法
if (user != null) {
System.out.println(user.getName());
}
}
3.2 filter
借助filter可以对Optional进行条件过滤 :
public static void test(User user) {
Optional<User> optional = Optional.ofNullable(user);
// 如果容器中的对象存在,并且符合过滤条件,返回装载对象的Optional容器,否则返回一个空的Optional容器
optional.filter((value) -> "Tom".equals(value.getName()));
}
3.3 map
public static void test(User user) {
Optional<User> optional = Optional.ofNullable(user);
// 如果容器的对象存在,则对其执行调用mapping函数得到返回值。然后创建包含mapping返回值的Optional,否则返回空Optional。
optional.map(user1 -> user1.getName()).orElse("Unknown");
}
// 上面一句代码对应着最开始的老写法:
public String tradition(User user) {
if (user != null) {
return user.getName();
}else{
return "Unknown";
}
}
上一篇: elementui的使用
下一篇: elementui表格改变行高,vue