java8系列之Optional

来源:互联网 发布:我想开淘宝网店怎么开 编辑:程序博客网 时间:2024/06/05 21:50

概述

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为空,打印结果为trueSystem.out.println(emptyOptional.isPresent());Optional<String> ofOptional = Optional.of("wang");// ofOptional有值,打印结果为trueSystem.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.emptySystem.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.emptySystem.out.println(emptyMap);// 打印结果:Optional.emptySystem.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 OptionalSystem.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!"));//输出:SanaullaSystem.out.println(name.orElse("There is some value!"));

orElseGet

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

示例:

//orElseGet与orElse方法类似,区别在于orElse传入的是默认值,//orElseGet可以接受一个lambda表达式生成默认值。//输出:Default ValueSystem.out.println(empty.orElseGet(() -> "Default Value"));//输出:SanaullaSystem.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 0
原创粉丝点击