1.Optional.of()或者Optional.ofNullable():创建Optional对象,差别在于of不允许参数是null,而ofNullable则无限制。
@Test public void testOptional() { // 参数不能是null Optional<Object> optional1 = Optional.of("1"); // 参数可以是null Optional<Object> optional2 = Optional.ofNullable(null); // 参数可以是非null Optional<Object> optional3 = Optional.ofNullable(2); }
2.isPresent():判断值是否存在
// isPresent判断值是否存在
System.out.println(optional1.isPresent() == true);
System.out.println(optional2.isPresent() == false);
isPresent() 源码如下:
public boolean isPresent() {
return value != null;
}
3.orElse和orElseGet区别 如果optional对象保存的值不是null,则返回原来的值,否则返回value。 orElseGet(Supplier supplier):功能与orElse一样,只不过orElseGet参数是一个对象 //这个示例中,两个 Optional 对象都包含非空值,两个方法都会返回对应的非空值。 // 不过,orElse() 方法仍然创建了 User 对象。 // 与之相反,orElseGet() 方法不创建 User 对象。 @Test public void test1() { User user = new User("23",1); log.debug("Using orElse"); User result = Optional.ofNullable(user).orElse(createNewUser()); log.info(result.toString()); log.debug("Using orElseGet"); User result2 = Optional.ofNullable(user).orElseGet(() -> createNewUser()); log.info(result2.toString()); }
private User createNewUser() { log.debug("Creating New User"); return new User("123", 1); }
4.map 的使用
@Test public void map() { User user = new User("xxx@qq.com", 21); String email = Optional.ofNullable(user) .map(u -> u.getName()).orElse("default@gmail.com"); log.info(email); assertEquals(email, user.getName()); }
5.flatMap() 也需要函数作为参数,并对值调用这个函数,然后直接返回结果。
@Test public void flatMap() { User user = new User("xxx@qq.com", 23); user.setPosition("Developer"); String position = Optional.ofNullable(user) .flatMap(u -> u.getPosition()).orElse("default"); log.info(position); assertEquals(position, user.getPosition().get()); }
6.值过滤
/** * 值过滤 */ @Test public void whenFilter_thenOk() { User user = new User("xxx@qq.com", 14); Optional<User> result = Optional.ofNullable(user) .filter(u -> u.getEmail() != null && u.getEmail().contains("@")); assertTrue(result.isPresent()); }