Optional
Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
Optional 类的引入很好的解决空指针异常。
of
根据传入的值生成Optional对象
of方法通过工厂方法创建Optional类。需要注意的是,创建对象时传入的参数不能为null。如果传入参数为null,则抛出NullPointerException 。
User u1 = new User();
User u2 = new User();
u2.setName("张三");
User u3 = null;
Optional<User> user1 = Optional.of(u1);
Optional<User> user2 = Optional.of(u2);
// 打印空user对象的name值
user1.ifPresent(user -> {
System.out.println("user.getName()");
});
// 打印name = 张三的user对象的name值
user2.ifPresent(user -> {
System.out.println("user.getName()");
});
// NullPointerException
Optional<User> user3 = Optional.of(u3);
ofNullable
根据传入的值生成Optional对象
如果指定的值为null,则返回一个空的Optional。
User u1 = new User();
User u2 = new User();
u2.setName("张三");
User u3 = null;
Optional<User> user1 = Optional.ofNullable(u1);
Optional<User> user2 = Optional.ofNullable(u2);
Optional<User> user3 = Optional.ofNullable(u3);
// 打印空user对象的name值
user1.ifPresent(user -> {
System.out.println(user.getName());
});
// 打印name = 张三的user对象的name值
user2.ifPresent(user -> {
System.out.println(user.getName());
});
// 打印empty
log.info("user3:" + user3.toString());
get
如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException
User u2 = new User();
u2.setName("张三");
User u3 = null;
User user2 = Optional.ofNullable(u2).get();
// 打印name = 张三的user对象
log.info("user2:" + user2);
// NoSuchElementException
User user3 = Optional.ofNullable(u3).get();
log.info("user3:" + user3);
isPresent
如果有值返回true,如果为null返回false。
User u2 = new User();
u2.setName("张三");
User u3 = null;
boolean booleanUser2 = Optional.ofNullable(u2).isPresent();
boolean booleanUser3 = Optional.ofNullable(u3).isPresent();
// true
log.info("booleanUser2:" + booleanUser2);
// false
log.info("booleanUser3:" + booleanUser3);
ifPrensent
该方法也可以检测是否为null,同时该方法还可以接受一个Consumer参数。
User u2 = new User();
u2.setName("张三");
Optional.ofNullable(u2).ifPresent(user -> user.setAge(21));
// 21
log.info("u2:" + u2.getAge());
orElse
如果有值则将其返回,否则返回指定的其它值。
User u2 = new User();
u2.setName("张三");
User u3 = null;
User user = Optional.ofNullable(u3).orElse(u2);
// 打印u2对象
log.info("user:" + user.toString());
orElseGet
orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值。
User u2 = new User();
u2.setName("张三");
User u3 = null;
User user1 = Optional.ofNullable(u3).orElseGet(() -> new User());
User user2 = Optional.ofNullable(u3).orElseGet(() -> u2);
// 打印User空对象
log.info("user1:" + user1.toString());
// u2对象
log.info("user2:" + user2.toString());
备注:orElse和orElseGet区别:当user对象不为null时,orElse能创建User对象,而orElseGet方法不创建User对象。
orElseThrow
如果有值则将其返回,否则抛出supplier接口创建的异常。
User u1 = null;
User u2 = new User();
u2.setName("张三");
User user2 = Optional.ofNullable(u2).orElseThrow(() -> new IllegalStateException());
// 打印u2对象
log.info("user2:" + user2.toString());
// IllegalStateException
User user1 = Optional.ofNullable(u1).orElseThrow(() -> new IllegalStateException());
map
如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。
map方法用来对Optional实例的值执行一系列操作。通过一组实现了Function接口的lambda表达式传入操作。
User u1 = new User();
u1.setName("张三");
User u2 = new User();
u2.setName("李四");
u2.setEmail("lisi@163.com");
Optional<String> s = Optional.ofNullable(u1).map(user -> user.getEmail());
String email1 = s.orElse("zhangsan@sina.com");
// zhangsan@sina.com
log.info("email1:" + email1);
String email2 = Optional.ofNullable(u2).map(user -> user.getEmail()).orElse("lisi@hotmail.com");
// lisi@163.com
log.info("email2:" + email2);
flatMap
如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。
flatMap方法与map方法类似,区别在于mapping函数的返回值不同。map方法的mapping函数返回值可以是任何类型T,而flatMap方法的mapping函数必须是Optional。
User u1 = new User();
u1.setName("张三");
String name = Optional.ofNullable(u1).flatMap(user -> user.getName()).orElse("zhangsan");
// 张三
log.info("name:" + name);
filter
如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional。
User user = new User();
user.setName("张三");
user.setAge(11);
User user1 = Optional.ofNullable(user).filter(u -> u.getName().equals("张三") && u.getAge() == 11).orElseThrow(() -> new NullPointerException());
// user对象
log.info("user1:" + user1);
// NullPointerException
User user2 = Optional.ofNullable(user).filter(u -> u.getName().equals("张三") && u.getAge() == 22).orElseThrow(() -> new NullPointerException());
log.info("user2:" + user2);
综合应用
CustomListResult customListResult = customListParamMapper.getCustomListByMenuName(customListParam);
Optional.ofNullable(customListResult).ifPresent(result -> {
result.setMenus(JSON.parseArray(customListResult.getMenuArr()));
});