Java中的Optional是一个容器对象,它可以包含一个非空值,也可以为空。它的主要作用是在编写代码时避免空指针异常。
java 8 中Optional的完整用法如下:
1. 创建Optional对象
可以通过of()方法创建一个包含非空值的Optional对象,例如:
Optional<String> optional = Optional.of("value");
也可以通过ofNullable()方法创建一个包含可能为空的值的Optional对象,例如:
Optional<String> optional = Optional.ofNullable(null);
2. 获取Optional对象的值
可以通过get()方法获取Optional对象中的非空值,例如:
String value = optional.get();
如果Optional对象中的值为空,调用get()方法会抛出NoSuchElementException异常。因此,在调用get()方法之前,最好先使用isPresent()方法判断Optional对象是否包含一个非空值。
3. 判断Optional对象是否包含非空值
可以使用isPresent()方法判断Optional对象是否包含一个非空值,例如:
if (optional.isPresent()) {
// Optional对象包含非空值
} else {
// Optional对象为空
}
也可以使用ifPresent()方法在Optional对象包含非空值时执行一些操作,例如:
optional.ifPresent(value -> System.out.println(value));
4. 获取Optional对象中的值或默认值
可以使用orElse()方法获取Optional对象中的值或默认值,例如:
String value = optional.orElse("default");
如果Optional对象中的值为空,则返回指定的默认值。
5. 获取Optional对象中的值或抛出异常
可以使用orElseThrow()方法获取Optional对象中的值或抛出异常,例如:
String value = optional.orElseThrow(() -> new RuntimeException("value is null"));
如果Optional对象中的值为空,则抛出指定的异常。
6. 转换Optional对象中的值
可以使用map()方法将Optional对象中的值转换为另一个类型的值,例如:
Optional<Integer> optional = Optional.of("123").map(Integer::parseInt);
如果Optional对象中的值为空,则返回一个空的Optional对象。
7. 过滤Optional对象中的值
可以使用filter()方法过滤Optional对象中的值,例如:
Optional<String> optional = Optional.of("value").filter(value -> value.startsWith("v"));
如果Optional对象中的值不满足指定的过滤条件,则返回一个空的Optional对象。
Java 9 增强
我们介绍了 Java 8 的特性,Java 9 为 Optional 类添加了三个方法:or()、ifPresentOrElse() 和 stream()。
or() 方法与 orElse() 和 orElseGet() 类似,它们都在对象为空的时候提供了替代情况。or() 的返回值是由 Supplier 参数产生的另一个 Optional 对象。
如果对象包含值,则 Lambda 表达式不会执行:
@Test
public void whenEmptyOptional_thenGetValueFromOr() {
User result = Optional.ofNullable(user)
.or( () -> Optional.of(new User("default","1234"))).get();
assertEquals(result.getEmail(), "default");
}
上面的示例中,如果 user 变量是 null,它会返回一个 Optional,它所包含的 User 对象,其电子邮件为 “default”。
ifPresentOrElse() 方法需要两个参数:一个 Consumer 和一个 Runnable。如果对象包含值,会执行 Consumer 的动作,否则运行 Runnable。
如果你想在有值的时候执行某个动作,或者只是跟踪是否定义了某个值,那么这个方法非常有用:
Optional.ofNullable(user).ifPresentOrElse( u -> logger.info("User is:" + u.getEmail()),
() -> logger.info("User not found"));