Skip to content

Java8新特性-Optional

Java 8引入了Optional类,这是一个容器类,它可能包含或者不包含非null值。Optional的设计目的是尽可能避免空指针异常(NullPointerException),鼓励程序员更好地设计代码,避免null值的滥用,从而提高代码的健壮性。

Optional的特性

  • 避免空指针:通过使用Optional,可以避免直接返回null,减少NullPointerException的风险。
  • 链式调用:支持优雅的链式调用,便于进行一系列可能为空的值的处理。
  • 明确意图:代码阅读者可以清楚地看到某个值可能是不存在的。
  • 静态工厂方法:提供了多种静态方法来创建Optional实例,如ofNullableof等。

常用方法

optional

optional

创建Optional

  • Optional.of(T value): 创建一个Optional实例,value必须非null。
  • Optional.ofNullable(T value): 创建一个Optional实例,value可以为null。
  • Optional.empty(): 创建一个空的Optional实例。

判断是否存在

  • isPresent(): 判断是否有值存在。
  • isEmpty()Java9: 判断是否为空。

获取值

  • get(): 如果Optional有值则返回,否则抛出NoSuchElementException异常。
  • orElse(T other): 如果Optional有值则返回,否则返回other。
  • orElseGet(Supplier<? extends T> supplier): 如果Optional有值则返回,否则返回supplier的get方法结果。

转换与映射

  • map(Function<? super T, ? extends U> mapper): 如果有值,则对其应用提供的mapping函数(返回任意类型),否则返回Optional.empty()。
  • flatMap(Function<? super T, Optional<U>> mapper): 如果有值,则对其应用提供的mapping函数并平坦化结果(只能返回Optional),否则返回Optional.empty()。

过滤

  • filter(Predicate<? super T> predicate): 如果值存在并且满足predicate,则返回Optional包含该值,否则返回Optional.empty()。
Java
import java.util.Optional;

public class OptionalDemo {

    public static void main(String[] args) {
        // 创建Optional实例
        Optional<String> optionalWithValue = Optional.of("Hello World");
        Optional<String> optionalEmpty = Optional.empty();
        
        // 判断是否存在
        System.out.println(optionalWithValue.isPresent()); // 输出: true
        System.out.println(optionalEmpty.isEmpty());      // 输出: true
        
        // 获取值
        System.out.println(optionalWithValue.get());       // 输出: Hello World
        System.out.println(optionalEmpty.orElse("默认值")); // 输出: 默认值
        
        // 转换与映射
        Optional<Integer> length = optionalWithValue.map(String::length);
        System.out.println(length.get()); // 输出: 11
        
        // 过滤
        Optional<String> filtered = optionalWithValue.filter(s -> s.length() > 5);
        System.out.println(filtered.get()); // 输出: Hello World
        
        // 扁平化
        Optional<String> flatMapped = optionalWithValue.flatMap(OptionalDemo::toUppercase);
        System.out.println(flatMapped.get()); // 输出: HELLO WORLD
    }

    // 示例方法,返回Optional
    static Optional<String> toUppercase(String str) {
        return Optional.ofNullable(str).map(String::toUpperCase);
    }
}

Released under the MIT License.