Optional
-
Optional本质是一个包装值的盒子,盒子里面有可能有对象,也有可能为空,但是不管哪种情况,这个Option本身是存在的,从而避免了直接操作null对象的风险
-

// 1. 创建 Optional 对象
User realUser = new User("admin", 1);
User nullUser = null;
// 包装非 null 值
Optional<User> optionalWithValue = Optional.of(realUser);
// 包装可能为 null 的值(最常用)
Optional<User> optionalWithNull = Optional.ofNullable(nullUser);
// 空 Optional
Optional<User> optionalEmpty = Optional.empty();
// 2. 取值/处理
// 有值则输出,无值不执行
optionalWithValue.ifPresent(user -> System.out.println("用户名:" + user.getName())); // 输出:用户名:admin
optionalWithNull.ifPresent(user -> System.out.println("用户名:" + user.getName())); // 无输出
// 无值时返回默认值
User defaultUser = optionalWithNull.orElse(new User("guest", 0));
System.out.println(defaultUser.getName()); // 输出:guest
// 无值时生成默认值(懒加载)
User lazyUser = optionalWithNull.orElseGet(() -> createGuestUser());
System.out.println(lazyUser.getName()); // 输出:guest_lazy
// 无值时抛异常
try {
optionalWithNull.orElseThrow(() -> new NullPointerException("用户不存在"));
} catch (NullPointerException e) {
System.out.println(e.getMessage()); // 输出:用户不存在
}
- 链式调用,ofNullable表示可能封装了一个对象也可能为null,map主要是对对象进行转换,先从User中拿到Address不为空的对象,然后再从Address拿到City属性,所以Map方法主要是做转换的,可以穿透层级拿数据,但是Filter方法是根据条件判断是否符合条件,不符合筛除掉
Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.ifPresent(city -> System.out.println(city));

浙公网安备 33010602011771号