java8系列之Optional

概述

Java 8引入Optional类来防止空指针异常,Optional类最先是由Google的Guava项目引入的。Optional类实际上是个容器:它可以保存类型T的值,或者保存null。使用Optional类我们就不用显式进行空指针检查了。

API

创建Optional

  • empty:创建一个空的Optional
  • of:为非null的值创建一个Optional
  • ofNullable:创建一个可为null的Optional

empty

empty方法通过工厂创建一个空的Optional.

示例:

Optional empty = Optional.empty();

of

of方法通过工厂方法创建Optional类。

注:创建对象时传入的参数不能为null。如果传入参数为null,则抛出NullPointerException。

示例:

//调用工厂方法创建Optional实例
Optional<String> name = Optional.of("Sanaulla");
//传入参数为null,抛出NullPointerException.
Optional<String> someNull = Optional.of(null);

ofNullable

ofNullable与of方法相似,唯一的区别是可以接受参数为null的情况

示例:

//下面创建了一个不包含任何值的Optional实例
//例如,值为'null'
Optional empty = Optional.ofNullable(null)

判断是否有值

isPresent用来判断Optinal是否有值。如果值存在返回true,否则返回false。

示例:

Optional emptyOptional = Optional.empty();
// emptyOptional为空,打印结果为false
System.out.println(emptyOptional.isPresent());

Optional<String> ofOptional = Optional.of("wang");
// ofOptional有值,打印结果为true
System.out.println(ofOptional.isPresent());

转换Optional

filter

filter方法接受一个条件函数,对Optional进行过滤。如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional。

示例:

//filter方法检查给定的Option值是否满足某些条件。
//如果满足则返回同一个Option实例,否则返回空Optional。
Optional<Integer> age = Optional.of(20);
Optional<Integer> oldAge = age.filter(a -> a > 18);
Optional<Integer> lessAge = age.filter(a -> a < 18);
// 打印结果:Optional[20]
System.out.println(oldAge);
// 打印结果:Optional.empty
System.out.println(lessAge);

map

map方法用来对Optional实例的值执行一系列操作。通过一组实现了Function接口的lambda表达式传入操作。如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。

示例:

Optional emptyOptional = Optional.empty();
Optional<Integer> ageMap = Optional.of(20);
Optional<String> ageMap_ = ageMap.map(a -> "ageMap:" + a);
Optional<String> emptyMap = emptyOptional.map(a -> "ageMap:" + age);
Optional<String> nullMap = ageMap.map(a -> null);
// 打印结果:Optional[ageMap:20]
System.out.println(ageMap_);
// 打印结果:Optional.empty
System.out.println(emptyMap);
// 打印结果:Optional.empty
System.out.println(nullMap);

flatMap

如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装。

示例:

Optional<String> flat = Optional.of("hello flatMap");
Optional<String> flatMap = flat.flatMap(it -> Optional.of(it.toUpperCase()));
// 打印结果:Optional[HELLO FLATMAP]
System.out.println(flatMap);

获取Optional的值

get

get方法将获取Optional中value的值,如果存在值,则返回该值,否则抛出NoSuchElementException。

示例:

Optional<String> getOptional = Optional.of("This is a Optional");
String valueOptional = getOptional.get();
// 打印结果:This is a Optional
System.out.println(valueOptional);

orElse

如果Optional实例有值则将其返回,否则返回orElse方法传入的参数。

示例:

//如果值不为null,orElse方法返回Optional实例的值。
//如果为null,返回传入的消息。
//输出:There is no value present!
System.out.println(empty.orElse("There is no value present!"));
//输出:Sanaulla
System.out.println(name.orElse("There is some value!"));

orElseGet

rElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值。

示例:

//orElseGet与orElse方法类似,区别在于orElse传入的是默认值,
//orElseGet可以接受一个lambda表达式生成默认值。
//输出:Default Value
System.out.println(empty.orElseGet(() -> "Default Value"));
//输出:Sanaulla
System.out.println(name.orElseGet(() -> "Default Value"));
orElseThrow

orElseThrow

在orElseGet方法中,我们传入一个Supplier接口。然而,在orElseThrow中我们可以传入一个lambda表达式或方法,如果值不存在来抛出异常。

示例:

try {
  //orElseThrow与orElse方法类似。与返回默认值不同,
  //orElseThrow会抛出lambda表达式或方法生成的异常 
 
  empty.orElseThrow(ValueAbsentException::new);
} catch (Throwable ex) {
  //输出: No value present in the Optional instance
  System.out.println(ex.getMessage());
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值