其实Optional类在Java8中就引入了,用于避免null检查和NullPointerException指针问题。
在Java9中,Optional类得到了进一步的改进,增加了一些新的方法,使其更加灵活和易用。
以下是一些Java9中对Optional类的改进:
- stream():返回包含值的流,如果值不存在,则返回空流
- ifPresentOrElse():如果值存在则对值执行一些操作,否则执行另一个操作
- or():如果值存在,则返回用于描述该值的Optional,如果不存在则生成一个值
stream()
在Java 9中,Optional类添加了stream方法,该方法返回一个包含值的Stream,如果Optional为空,则返回空的Stream。这使得Optional对象可以更容易地与Java的Stream API结合使用。
steam()方法的原型如下:
public Stream<T> stream() {
if (isEmpty()) {
return Stream.empty();
} else {
return Stream.of(value);
}
}
如果值存在,则返回包含值的有序的流,如果值不存在,则返回一个空流。
stream()方法的使用如下:
// Optional.of,类似Stream.of
long count = Optional.of(100).stream().count();
System.out.println(count);
// Optional.empty,类似Optional.ofNullable/Stream.ofNullable
count = Optional.empty().stream().count();
System.out.println(count);
结合Java 8引入的方法链(method chaining)和Java 9中的新特性,可以更加简洁地处理Optional对象。
例如,你可以链式调用map, flatMap, filter等方法,并在最后使用ifPresentOrElse或orElseThrow等方法来处理结果。
ifPresentOrElse()
ifPresentOrElse()方法的原型如下:
public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction) {
if (value != null) {
action.accept(value);
} else {
emptyAction.run();
}
}
这个方法允许你指定两个操作:一个当Optional对象包含值时执行,另一个当Optional为空时执行。这提供了比原来的ifPresent方法更全面的处理方式。
ifPresentOrElse()方法的使用如下:
Optional<String> optionalValue = Optional.of("Hello, World!");
optionalValue.ifPresentOrElse(
value -> System.out.println("Value is present: " + value),
() -> System.out.println("Value is empty.")
);
or()
or()方法的原型如下:
public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier) {
Objects.requireNonNull(supplier);
if (isPresent()) {
return this;
} else {
@SuppressWarnings("unchecked")
Optional<T> r = (Optional<T>) supplier.get();
return Objects.requireNonNull(r);
}
}
如果值存在,则返回一个描述该值的Optional,否则使用supplier生成一个值。
or()方法的使用如下:
// or()
Optional.empty().or(() -> Optional.of(100)).ifPresent(System.out::println);
这些改进增强了Optional类的功能性和易用性,使得在处理可能为null的值时更加灵活和安全。然而,需要注意的是,虽然Optional类在某些情况下很有用,但它并不是所有null值问题的解决方案。过度使用Optional可能会导致代码变得复杂和难以理解,因此应该谨慎使用。在Java中,最好的做法通常是避免null值,通过更好的设计和API来确保类型安全。