前言
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容器,否则不放;
T 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的苹果记录;