前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Optional

Optional

作者头像
发布2019-08-14 14:38:50
8020
发布2019-08-14 14:38:50
举报
文章被收录于专栏:WD学习记录

目前的理解:

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

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

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

以下为查看源代码学习:

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

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

第一个对象:

代码语言:javascript
复制
private static final Optional<?> EMPTY = new Optional<>();

一个空对象

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

代码语言:javascript
复制
private final T value;

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

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

代码语言:javascript
复制
private Optional() {

this.value = null;

}

构造一个空的实例

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

代码语言:javascript
复制
public static<T> Optional<T> empty() {

@SuppressWarnings("unchecked")

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

return t;

}

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

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

代码语言:javascript
复制
private Optional(T value) {

this.value = Objects.requireNonNull(value);

}

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

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

代码语言:javascript
复制
public static <T> Optional<T> of(T value) {

return new Optional<>(value);

}

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

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

代码语言:javascript
复制
public static <T> Optional<T> ofNullable(T value) {

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

}

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

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

代码语言:javascript
复制
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说明是纯函数。纯函数这里理解为,对于特定的输入,都将产生对应的唯一输出,且不会影响别的东西。

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

代码语言:javascript
复制
public boolean isPresent() {

return value != null;

}

判断value是否为null

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

代码语言:javascript
复制
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方法

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

代码语言:javascript
复制
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()

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

代码语言:javascript
复制
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();

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

代码语言:javascript
复制
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中了。

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

代码语言:javascript
复制
public T orElse(T other) {

return value != null ? value : other;

}

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

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

代码语言:javascript
复制
public T orElseGet(Supplier<? extends T> other) {

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

}

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

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

代码语言:javascript
复制
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {

if (value != null) {

return value;

} else {

throw exceptionSupplier.get();

}

}

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

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

代码语言:javascript
复制
@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);

}

相等

其他方法略。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年08月04日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目前的理解:
  • 以下为查看源代码学习:
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档