Java 8引入了Optional类,这是一个可以包含或不包含非空值的容器对象。它主要用于避免显式的null检查,从而减少空指针异常(NullPointerException)的发生。
创建Optional对象
-
使用
Optional.of(): 如果确定值不为null,可以使用此方法。如果传入null,会抛出NullPointerException。Optional<String> optional = Optional.of("Hello"); -
使用
Optional.ofNullable(): 允许传入null值。如果值为null,则创建一个空的Optional对象。Optional<String> optional = Optional.ofNullable(null); -
使用
Optional.empty(): 创建一个空的Optional对象。Optional<String> optional = Optional.empty();
访问Optional中的值
-
使用
isPresent()和get():isPresent()用于检查是否有值,get()用于获取值。注意,直接调用get()在没有值的情况下会抛出NoSuchElementException。if (optional.isPresent()) { System.out.println(optional.get()); } -
使用
ifPresent(): 如果值存在,执行给定的操作。optional.ifPresent(value -> System.out.println(value)); -
使用
orElse()和orElseGet(): 如果值存在,返回该值;否则,返回默认值。orElseGet()接受一个Supplier接口,只有在需要时才会计算默认值。String value = optional.orElse("Default Value"); String value2 = optional.orElseGet(() -> "Computed Default Value"); -
使用
orElseThrow(): 如果值存在,返回该值;否则,抛出由指定的Supplier生成的异常。String value = optional.orElseThrow(() -> new IllegalStateException("Value is not present"));
转换Optional中的值
-
使用
map(): 如果值存在,应用提供的函数并返回一个新的Optional对象。Optional<Integer> length = optional.map(String::length); -
使用
flatMap(): 类似于map(),但要求返回值必须是Optional类型。Optional<Integer> length = optional.flatMap(value -> Optional.of(value.length()));
过滤Optional中的值
- 使用
filter(): 如果值存在并且满足提供的谓词条件,返回包含该值的Optional对象;否则,返回一个空的Optional对象。Optional<String> filtered = optional.filter(value -> value.startsWith("H"));
示例代码
下面是一个综合示例,展示了如何使用Optional类:
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
// 创建一个包含非空值的Optional对象
Optional<String> optional = Optional.of("Hello, World!");
// 检查值是否存在
if (optional.isPresent()) {
System.out.println("Value is present: " + optional.get());
} else {
System.out.println("Value is not present");
}
// 使用ifPresent()方法
optional.ifPresent(value -> System.out.println("Value using ifPresent: " + value));
// 使用orElse()方法
String defaultValue = optional.orElse("Default Value");
System.out.println("Value using orElse: " + defaultValue);
// 使用orElseGet()方法
String computedValue = optional.orElseGet(() -> "Computed Default Value");
System.out.println("Value using orElseGet: " + computedValue);
// 使用orElseThrow()方法
try {
String value = optional.orElseThrow(() -> new IllegalStateException("Value is not present"));
System.out.println("Value using orElseThrow: " + value);
} catch (IllegalStateException e) {
System.out.println(e.getMessage());
}
// 使用map()方法
Optional<Integer> length = optional.map(String::length);
length.ifPresent(len -> System.out.println("Length of the string: " + len));
// 使用flatMap()方法
Optional<Integer> flatMappedLength = optional.flatMap(value -> Optional.of(value.length()));
flatMappedLength.ifPresent(len -> System.out.println("Flat mapped length: " + len));
// 使用filter()方法
Optional<String> filtered = optional.filter(value -> value.contains("World"));
filtered.ifPresent(val -> System.out.println("Filtered value: " + val));
}
}
输出:
Value is present: Hello, World!
Value using ifPresent: Hello, World!
Value using orElse: Hello, World!
Value using orElseGet: Hello, World!
Value using orElseThrow: Hello, World!
Length of the string: 13
Flat mapped length: 13
Filtered value: Hello, World!
通过这些方法,你可以更优雅地处理可能为null的值,减少空指针异常的风险,提高代码的可读性和健壮性。

5万+

被折叠的 条评论
为什么被折叠?



