Optional简介
java 用来处理 .NPE 提供的类
内部方法
-
Optional.of():
当对象为null时, 创建过程会抛出NPE异常 -
Optional.ofNullable():
当对象为null时, 也能正常返回Optional对象 -
Optional.isPrent():
对象有值 返回true, 为null 返回false -
Optional.ifPresent({…}):
当 op不为null, 执行内部方法 -
Optional.get():
取出原值, 如果原值为null 会抛出异常, orElse 取出原值, 原值为null赋值默认值
…
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Optional;
/**
* @description: 对象容器测试
* @author: xxx
* @date: 2022/11/29 14:27
*/
public class OptionalTest {
public static void main(String[] args) {
Object object1 = new Object();
Object object2 = null;
// Optional.of() 当对象为null时, 创建过程会抛出NPE异常
Optional<Object> optional1 = Optional.of(object1);
// Optional<Object> optional2 = Optional.of(object2);
// Optional.ofNullable() 当对象为null时, 也能正常返回Optional对象
Optional<Object> optional3 = Optional.ofNullable(object1);
Optional<Object> optional4 = Optional.ofNullable(object2);
System.out.println("-------------------------------------------------");
// Optional.isPrent() 对象有值 返回true, 为null 返回false
System.out.println("optional3: " + optional3.isPresent());
System.out.println("optional4: " + optional4.isPresent());
Integer i1 = 123;
Optional<Integer> op1 = Optional.ofNullable(i1);
System.out.println(op1.isPresent());
// op.ifPresent({..}) 当 op不为null, 执行内部方法
op1.ifPresent(i -> {
System.out.println("op1不为null执行");
System.out.println(i);
});
optional4.ifPresent(i -> {
System.out.println("optional4为null不执行");
System.out.println(i);
});
// 取值逻辑 get: 取出原值, 如果原值为null 会抛出异常, orElse 取出原值, 原值为null赋值默认值
System.out.println("\n-------------------------------------");
Integer integer = op1.get();
System.out.println("op1: " + integer);
System.out.println("op1: "+ op1.orElse(234));
// Object obj = optional4.get();
// System.out.println("obj: " + obj);
Object obj = optional4.orElse("321");
System.out.println("op2: "+ obj);
// orElseGet 取出原值, 原值为null 返回默认值, 内部可以做一些其他处理逻辑
Integer integer1 = op1.orElseGet(() -> {
System.out.println("------值为null处理逻辑, 并返回一个默认值给null的值-----");
return 999;
});
System.out.println("op1: " + integer1);
Object obj2 = optional4.orElseGet(() -> {
System.out.println("------值为null处理逻辑, 并返回一个默认值给null的值-----");
return "ni hao!";
});
System.out.println("op2: " + obj2);
System.out.println("\n -----------------------------------------------");
op1.orElseThrow(RuntimeException::new);
// optional4.orElseThrow(() -> new RuntimeException("值为null抛出异常"));
System.out.println("------------测试 op.map() 和 flatMap()-----------");
// map 返回的对象会被封装为 Optional
Integer length = Optional.of(new User(null, 10, null))
.map(User::getName)
.map(String::length)
.orElse(0);
System.out.println("长度: " + length);
// flatMap 返回的对象本来就是Optional, 不用再封装
Integer length2 = Optional.of(new User("张三", 20, Optional.ofNullable("北京")))
.flatMap(User::getAddr)
.map(String::length)
.orElse(0);
System.out.println("长度: " + length2);
}
@Data
@AllArgsConstructor
@NoArgsConstructor
static class User {
private String name;
private Integer age;
private Optional<String> addr;
}
}