详细介绍JDK8中Optional对象的高级用法

Optional 是 Java 8 引进的一个新特性,我们通常认为 Optional 是用于缓解 Java 臭名昭著的空指针异常问题。Optional 是个容器:它可以保存类型 T 的值,或者仅仅保存 null。如果值存在则 isPresent() 方法会返回 true,调用 get() 方法会返回该对象。Optional 提供很多有用的方法,这样我们就不用显式进行空值检测。

Optional 对象的高级用法包括:

  • Optional 对象的 map() 和 flatMap() 方法
  • Optional 对象的 filter() 方法
  • Optional 对象的 orElse() 和 orElseGet() 方法
  • Optional 对象的 or() 和 ifPresent() 方法
  • Optional 对象的 stream() 和 forEach() 方法

1.Optional 对象的 map() 和 flatMap() 方法

当 Optional 对象存在时,map() 方法会对其执行传入的 lambda 表达式操作,然后返回一个新的 Optional 对象。flatMap() 方法也是一样,但是它的 lambda 表达式返回一个 Optional 对象。如果你的映射函数返回一个 Optional 对象,那么 flatMap() 方法会将其展开并返回其中的值。

下面是一个例子,假设你有一个 Optional 对象,你想要将其中的字符串转换为大写形式:

Optional<String> string = Optional.of("hello world");
Optional<String> upperCaseString = string.map(String::toUpperCase);

这里,我们使用 map() 方法将字符串转换为大写形式。如果 string 对象存在,则 upperCaseString 对象也存在,并且包含转换后的字符串。如果 string 对象不存在,则 upperCaseString 对象也不存在。

下面是另一个例子,假设你有一个 Optional 对象,你想要将其中的字符串转换为大写形式,并且如果该对象不存在,则返回另一个默认值:

Optional<String> string = Optional.ofNullable(null);
String defaultString = "default";
String result = string.map(String::toUpperCase).orElse(defaultString);

这里,我们使用 map() 方法将字符串转换为大写形式。如果 string 对象存在,则 result 变量包含转换后的字符串。如果 string 对象不存在,则 result 变量包含默认值 “default”。

flatMap() 方法与 map() 方法类似,但是它的 lambda 表达式返回一个 Optional 对象。下面是一个例子,假设你有一个 Optional 对象和一个函数,该函数接受字符串并返回一个 Optional 对象:

Optional<String> string = Optional.of("123");
Function<String, Optional<Integer>> function = s -> Optional.of(Integer.parseInt(s));
Optional<Integer> integer = string.flatMap(function);

这里,我们使用 flatMap() 方法将字符串转换为整数。如果 string 对象存在,则 integer 对象也存在,并且包含转换后的整数。如果 string 对象不存在,则 integer 对象也不存在。

2.Optional 对象的 filter() 方法

filter() 方法用于检查 Optional 对象是否存在,并且是否满足给定的条件。如果 Optional 对象存在并且满足条件,则返回该对象;否则返回一个空的 Optional 对象。

下面是一个例子,假设你有一个 Optional 对象,你想要检查其中的字符串是否包含某个子字符串:

Optional<String> string = Optional.of("hello world");
Optional<String> filteredString = string.filter(s -> s.contains("world"));

这里,我们使用 filter() 方法检查字符串是否包含 “world” 子字符串。如果 string 对象存在并且包含该子字符串,则 filteredString 对象也存在,并且包含原始字符串。如果 string 对象不存在或者不包含该子字符串,则 filteredString 对象也不存在。

3.Optional 对象的 orElse() 和 orElseGet() 方法

orElse() 方法和 orElseGet() 方法都用于在 Optional 对象为空时提供默认值。如果 Optional 对象存在,则 orElse() 方法返回该对象的值;否则返回指定的默认值。orElseGet() 方法与 orElse() 方法类似,但是它的参数是一个 Supplier 对象,该对象可以生成默认值。

下面是一个例子,假设你有一个 Optional 对象,你想要获取其中的字符串,如果该对象不存在,则返回另一个默认值:

Optional<String> string = Optional.ofNullable(null);
String defaultString = "default";
String result = string.orElse(defaultString);

这里,我们使用 orElse() 方法获取字符串。如果 string 对象存在,则 result 变量包含该字符串。如果 string 对象不存在,则 result 变量包含默认值 “default”。

下面是另一个例子,假设你有一个 Optional 对象,你想要获取其中的字符串,如果该对象不存在,则通过调用某个方法来生成默认值:

Optional<String> string = Optional.ofNullable(null);
Supplier<String> supplier = () -> "default";
String result = string.orElseGet(supplier);

这里,我们使用 orElseGet() 方法获取字符串。如果 string 对象存在,则 result 变量包含该字符串。如果 string 对象不存在,则通过调用 supplier 对象来生成默认值 “default”。

4. Optional 对象的 or() 和 ifPresent() 方法

or() 方法用于在两个 Optional 对象中选择一个存在的对象。如果第一个 Optional 对象存在,则返回该对象;否则返回第二个 Optional 对象。

下面是一个例子,假设你有两个 Optional 对象,你想要获取其中的一个:

Optional<String> string1 = Optional.ofNullable(null);
Optional<String> string2 = Optional.of("hello world");
Optional<String> result = string1.or(() -> string2);

这里,我们使用 or() 方法获取字符串。如果 string1 对象不存在,则 result 变量包含 string2 对象的值 “hello world”。如果 string1 对象存在,则 result 变量包含该对象的值。

ifPresent() 方法用于检查 Optional 对象是否存在,并且执行给定的操作。如果 Optional 对象存在,则执行给定的操作;否则不执行任何操作。

下面是一个例子,假设你有一个 Optional 对象,你想要在控制台上打印其中的字符串:

Optional<String> string = Optional.of("hello world");
string.ifPresent(System.out::println);

这里,我们使用 ifPresent() 方法打印字符串。如果 string 对象存在,则将其传递给 System.out.println() 方法进行打印。如果 string 对象不存在,则不执行任何操作。

5. Optional 对象的 stream() 和 forEach() 方法

stream() 方法用于将 Optional 对象转换为 Stream 对象。如果 Optional 对象存在,则返回包含该对象的 Stream 对象;否则返回一个空的 Stream 对象。

下面是一个例子,假设你有一个 Optional 对象,你想要将其转换为 Stream 对象:

Optional<String> string = Optional.of("hello world");
Stream<String> stream = string.stream();

这里,我们使用 stream() 方法将字符串转换为 Stream 对象。如果 string 对象存在,则 stream 变量包含该对象的值 “hello world”。如果 string 对象不存在,则 stream 变量为空。

forEach() 方法用于对 Stream 对象中的每个元素执行给定的操作。如果 Stream 对象为空,则不执行任何操作。

下面是一个例子,假设你有一个 Optional 对象,你想要在控制台上打印其中的字符串:

Optional<String> string = Optional.of("hello world");
string.stream().forEach(System.out::println);

这里,我们使用 forEach() 方法打印字符串。如果 string 对象存在,则将其转换为 Stream 对象,并对其中的元素执行 System.out.println() 方法进行打印。如果 string 对象不存在,则不执行任何操作。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值