Optional

前言

1. Java8新增的Option类本质上类似于异常检查,迫使API用户关注/处理Option类中是否包含内容,从而避免因为null值检查而导致的潜在隐患;

2. Option不支持序列化,并且要尽量避免将Optional用于类属性方法参数集合元素。这三种情况可以用null值代替,没必要用Option;

3. Option本身为引用类型,大量使用在一定程度上会影响JVM的堆内存和垃圾回收;

4. 避免使用Optional的 equals()、hashCode()、==方法;参见这里

API介绍1.8

构造函数

Optional的构造函数是私有的,不能由外部调用(不能new)

static <T> Optional<T> of(T value) 

如果value参数为空,会报NPE异常,一般不用;

static <T> Optional<T> ofNullable(T value)

如果value参数为空,会报No value present异常;

boolean isPresent()

判断Option中是否有元素;

void ifPresent(Consumer<? super T> consumer)

如果Optional有元素,就消费;方法中的参数Consumer为函数式接口

T get()

 获取Option中的元素,一定要配合isPresent()方法使用;

T orElse(T other)

无论Optional容器是null还是non-null,都会执行orElse里的方法,如果Option容器为空,则将参数中的value放在Optional容器,否则不放;

orElseGet(Supplier other)

只有Optional容器为null,才会执行orElse里的方法,方法中的参数Supplier为函数式接口,该接口默认抽象get方法参数为空;

T orElseThrow(Supplier  exception) throws X

只有Optional容器为null,才会执行orElseThrow的方法,方法中的参数Supplier为函数式接口,该接口默认抽象get方法参数为空;

Optional<T> filter(Predicate  predicate)

针对Optional容器里的元素进行过滤,方法中的参数Predicate为函数式接口,该接口默认方法为test(T t);

<U> Optional<U> map(Function mapper)

针对Option中的元素进行运算,如下:Optional容器中维护了一个List,List中存放Apple,目的是将Apple重量大于150的苹果记录;

<U> Optional<U> flatMap(Function mapper)

原文地址:https://www.cnblogs.com/oxygenG/p/12594204.html