Optional

目前的理解:

1. Optional中包含一个可以为空的对象,应该在所有可能为空的地方都加上Optional作为返回值。强迫调用方自行判断是否为空。自己因为老是忘记判断是否为null而导致空指针。

2. Optional之前自己最习惯的用法是先判断是否是ifPresent,然后去进行下一步操作。看了代码之后,发现也可以通过orElse来设定默认值,或者是通过orElseThrow来抛出为空时的异常。

3. 看了Effective java,容器类的集合不应该返回Optional,直接返回一个空集合更加合适。

以下为查看源代码学习:

Optional是一个包含了可能为空的对象的容器对象,如果值存在(isPresent()),可以利用get()获取到

-----------------------

第一个对象:

private static final Optional<?> EMPTY = new Optional<>();

一个空对象

-------------------------

private final T value;

非空,get()获取到的就是这个对象

---------------------------

private Optional() {

this.value = null;

}

构造一个空的实例

-----------------------------

public static<T> Optional<T> empty() {

@SuppressWarnings("unchecked")

Optional<T> t = (Optional<T>) EMPTY;

return t;

}

返回一个空的Optional对象,即EMPTY

------------------------------

private Optional(T value) {

this.value = Objects.requireNonNull(value);

}

这里只能传入一个非空的对象,给value赋值

------------------------------

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

return new Optional<>(value);

}

这里只能传入非空对象,返回一个Optional对象,且该对象的isPresent()是为true

--------------------------------

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

return value == null ? empty() : of(value);

}

与上面的方法类似,这里传入的是可以为空的对象,如果为空返回empty(),否则与of方法相同

-----------------------------------

public T get() {

if (value == null) {

throw new NoSuchElementException("No value present");

}

return value;

}

获取value,如果为空,跑出异常,否则返回value。

补充:

@NotNull

@Contract(pure=true):

可参考文档

https://ice1000.org/2017/01/07/JBAnnotations2/

例子:

@NotNull

@Contract(value = "_, _ -> !null", pure = true)

返回值为非null,因此@NotNull,

不管传进来任何值,都不会返回null,因此value是_, _ -> !null,pure=true说明是纯函数。纯函数这里理解为,对于特定的输入,都将产生对应的唯一输出,且不会影响别的东西。

-------------------------------------

public boolean isPresent() {

return value != null;

}

判断value是否为null

---------------------------------------

public void ifPresent(Consumer<? super T> consumer) {

if (value != null)

consumer.accept(value);

}

如果value不存在,调用传入的consumer,

补充:

Consumer接口:

void accept(T t);

调用accept方法

default Consumer<T> andThen(Consumer<? super T> after) {

Objects.requireNonNull(after);

return (T t) -> { accept(t); after.accept(t); };

}

传入的after不能为空,先调用默认的accept,然后调用after实现的accept方法

Consumer接口上有个注解:@FunctionalInterface

https://www.cnblogs.com/chenpi/p/5890144.html

函数式接口,即接口里边只有一个抽象方法,用于编译级错误检查,接口不符合函数式接口定义,就会报错。函数式接口里边还可以包含默认方法、静态方法、java.lang.Object里边的public方法

---------------------------------------------------

public Optional<T> filter(Predicate<? super T> predicate) {

Objects.requireNonNull(predicate);

if (!isPresent())

return this;

else

return predicate.test(value) ? this : empty();

}

如果value不为null切符合predicate,返回这个Optional对象,否则返回empty()

-----------------------------------------------------

public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {

Objects.requireNonNull(mapper);

if (!isPresent())

return empty();

else {

return Optional.ofNullable(mapper.apply(value));

}

}

如果value不为null,调用传入的mapper方法,然后返回Optional.ofNullable(mapper结果),否则返回empty();

--------------------------------------------------

public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {

Objects.requireNonNull(mapper);

if (!isPresent())

return empty();

else {

return Objects.requireNonNull(mapper.apply(value));

}

}

这个方法与上一个类似,但是mapper本身的返回就是在optional中了。

--------------------------------------------------------

public T orElse(T other) {

return value != null ? value : other;

}

传入参数非空,返回也非空,value不为null返回value,value为null,返回输入的other

-------------------------------------------------------

public T orElseGet(Supplier<? extends T> other) {

return value != null ? value : other.get();

}

与上一个方法类似,但是传入的是实现了接口Supplier的

----------------------------------------------------

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {

if (value != null) {

return value;

} else {

throw exceptionSupplier.get();

}

}

value为null抛出异常,否则返回value

---------------------------------------------

@Override

public boolean equals(Object obj) {

if (this == obj) {

return true;

}

if (!(obj instanceof Optional)) {

return false;

}

Optional<?> other = (Optional<?>) obj;

return Objects.equals(value, other.value);

}

相等

其他方法略。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值