Java中的Optional类

JDK 8的新特性

📦 Optional类的定义

Optional 类是 Java 8 引入的一个容器类,用来解决可能出现的 NullPointerException 问题。它表示一个值可能存在也可能不存在,提供了一种优雅的方式来避免显式的 null 检查。


💎 核心思想

  • 避免显式使用 null: 使用 Optional 代替直接返回 null,从而避免潜在的空指针异常。
  • 增强代码可读性: 提供清晰的 API,表示值的存在或缺失,并能安全处理缺失的值。
  • 函数式编程支持: 支持链式调用和流式操作,更适合在函数式编程中使用

🎯 创建对象方法

  • Optional.empty():创建一个空的 Optional 对象。
1
Optional<String> emptyOpt = Optional.empty();
  • Optional.of(value):根据非空值创建一个 Optional 对象。
1
Optional<String> nameOpt = Optional.of("John");

注意:传入 null 值会抛出 NullPointerException

  • Optional.ofNullable(value):根据值创建 Optional,值可以是 null
1
Optional<String> nullableOpt = Optional.ofNullable(null);

✅ 判断值是否存在

  • isPresent():值存在返回 true,否则返回 false
  • isEmpty():值不存在返回 true(Java 11 引入)。

💡 获取值

get():返回值,如果值不存在会抛出 NoSuchElementException

1
String name = nameOpt.get();

orElse(defaultValue):值存在则返回值,否则返回默认值。

1
String name = nullableOpt.orElse("Default Name");

🔧 操作值

💫 条件执行

  • ifPresent(Consumer<? super T>):值存在时执行给定的动作。
1
nameOpt.ifPresent(name -> System.out.println("Name: " + name));
  • ifPresentOrElse(Consumer<? super T>, Runnable):值存在执行第一个操作,否则执行第二个操作(Java 9 引入)。
1
2
3
4
nameOpt.ifPresentOrElse(
  name -> System.out.println("Name: " + name),
  () -> System.out.println("Name is empty")
);

🔄 映射与转换

  • map(Function<? super T, ? extends U>):值存在时对值进行映射操作,返回新的 Optional
1
Optional<Integer> lengthOpt = nameOpt.map(String::length);
  • flatMap(Function<? super T, ? extends Optional<? extends U>>):值存在时对值进行映射操作,返回 Optional(避免嵌套)。
1
2
3
Optional<String> upperOpt = nameOpt.flatMap(name -> 
  Optional.of(name.toUpperCase())
);

🛡️ 过滤与默认值

  • filter(Predicate<? super T>):值存在且满足条件则返回原 Optional,否则返回空 Optional
1
Optional<String> validName = nameOpt.filter(name -> name.length() > 3);
  • orElseThrow():值存在返回值,否则抛出 NoSuchElementException(Java 10 引入)。
1
String name = nameOpt.orElseThrow();
  • orElseThrow(Supplier<? extends X>):值存在返回值,否则抛出自定义异常。
1
String name = nameOpt.orElseThrow(() -> new IllegalArgumentException("Name is required"));

📝 实践建议

  • 优先使用 orElse(defaultValue) 处理默认值情况
  • 使用 map()filter() 进行函数式操作
  • 避免在业务逻辑中频繁使用 get(),容易引发异常
  • 充分利用 ifPresent()ifPresentOrElse() 进行条件处理
그 경기 끝나고 좀 멍하기 있었는데 여러분 이제 살면서 여러가
使用 Hugo 构建
主题 StackJimmy 设计