跳到主內容

Optional 相關

Optional是Java SE 8中的一个新特性,它提供了一种优雅的方式来处理可能为空的值,避免了空指针异常的问题。

Optional类提供了以下常用方法:

  • of():创建一个包含指定非空值的Optional对象。如果传入null,则会抛出NullPointerException异常。例如:
Optional<String> optional = Optional.of("hello");
  • empty():创建一个空的Optional对象。例如:
Optional<String> optional = Optional.empty();
  • isPresent():判断Optional对象是否包含非空值。例如:
Optional<String> optional = Optional.of("hello");
if (optional.isPresent()) {
System.out.println("value is present: " + optional.get());
}
  • get():获取Optional对象中的值,如果对象为空则抛出NoSuchElementException异常。例如:
Optional<String> optional = Optional.of("hello");
String value = optional.get();
System.out.println("value: " + value);
  • orElse():获取Optional对象中的值,如果对象为空则返回指定的默认值。例如:
Optional<String> optional = Optional.empty();
String value = optional.orElse("default");
System.out.println("value: " + value);
  • map():对Optional对象中的值进行映射操作,返回一个新的Optional对象。例如:
Optional<String> optional = Optional.of("hello");
Optional<Integer> result = optional.map(s -> s.length());
System.out.println("result: " + result.get());
  • filter():对Optional对象中的值进行过滤操作,返回一个新的Optional对象。例如:
Optional<String> optional = Optional.of("hello");
Optional<String> result = optional.filter(s -> s.startsWith("h"));
System.out.println("result: " + result.get());


需要注意的是,对Optional对象的操作通常采用链式调用的方式,如下所示:

Optional<String> optional = Optional.of("hello");
String result = optional.map(s -> s.toUpperCase())
                      .orElse("default");
System.out.println("result: " + result);
在上面的示例中,我们首先将字符串"hello"包装成Optional对象,然后使用map()方法将字符串转换成大写,最后使用orElse()方法获取处理结果,如果对象为空则返回指定的默认值"default"。

optional.isPresent()方法用于检查Optional对象是否包含非空值,如果对象中包含了一个非空的值,则返回true,否则返回false

如果使用Optional.of()方法创建一个Optional对象时,传入了一个空引用,则会抛出NullPointerException异常,而不是返回一个包含空值的Optional对象。因此,如果使用Optional.of()方法创建的Optional对象中包含了一个空引用,则调用optional.isPresent()方法会返回false,而不是检查空字符串。

如果需要检查一个空字符串,可以使用Optional.ofNullable()方法创建一个Optional对象,例如:

String str = "";
Optional<String> optional = Optional.ofNullable(str);
if (optional.isPresent()) {
    System.out.println("str is not empty");
} else {
    System.out.println("str is empty");
}

在上面的示例中,我们首先使用一个空字符串创建一个Optional对象,然后使用optional.isPresent()方法检查字符串是否为空。由于字符串为空,因此调用optional.isPresent()方法会返回false,所以最终输出结果为"str is empty"。