Optional是什么

java.util.Optional

Jdk8提供Optional,一个可以包含null值的容器对象,可以用来代替xx != null的判断。

Optional常用方法

of

public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}

为value创建一个Optional对象,如果value为空则 会报出NullPointerException异常。

ofNullable

public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}

为value创建一个Optional对象,但可以允许value为null值。

isPresent

public boolean isPresent() {
return value != null;
}

判断当前value是否为null,如果不为null则返回true,否则false。

ifPresent

如果不为null值就执行函数式接口的内容。

public void ifPresent(Consumer<? super T> consumer) {
if (value != null)
consumer.accept(value);
}

get

public T get() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}

返回当前的值,如果为空则报异常。

orElse

返回当前值,如果为null则返回other。

public T orElse(T other) {
return value != null ? value : other;
}

orElseGet

orElseGet和orElse类似,只是orElseGet支持函数式接口来生成other值。

public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}

orElseThrow

如果有值则返回,没有则用函数式接口抛出生成的异常。

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.get();
}
}

示例

public static void main(String[] args) {
testOf();
testNullable();
} private static void testNullable() {
User user = null;
User john = new User("john", 18);
User dick = new User("dick", 12); System.out.println(Optional.ofNullable(user).orElse(john));
System.out.println(Optional.ofNullable(john).get());
System.out.println(Optional.ofNullable(dick).orElse(john));
System.out.println(Optional.ofNullable(user).orElseGet(() -> john)); System.out.println();
} private static void testOf() {
try {
User user1 = new User();
Optional<User> userOptional1 = Optional.of(user1);
if (userOptional1.isPresent()) {
System.out.println("user is not null");
} User user2 = null;
Optional<User> userOptional2 = Optional.of(user2);//NullPointerException
if (userOptional2.isPresent()) {
System.out.println("user is not null");
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println();
}

Optional在jdk8中有大量使用,比如像Stream流中,但Optional用在null判断感觉也没什么鸟用。。

在Spring4中也可以用Optional来代替autowired(require=false)的情况,参考历史Spring系列文章。

推荐阅读

干货:免费领取2TB架构师四阶段视频教程

面经:史上最全Java多线程面试题及答案

工具:推荐一款在线创作流程图、思维导图软件

分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。

JDK8新特性之Optional的更多相关文章

  1. jdk8新特性:在用Repository实体查询是总是提示要java.util.Optional, 原 Inferred type 'S' for type parameter 'S' is not within its bound;

    jdk8新特性:在用Repository实体查询是总是提示要java.util.Optional 在使用springboot 方法报错: Inferred type 'S' for type para ...

  2. JDK8新特性一览

    转载自:http://blog.csdn.net/qiubabin/article/details/70256683 官方新特性说明地址 Jdk8新特性.png 下面对几个常用的特性做下重点说明. 一 ...

  3. 一次电话Java面试的问题总结(JDK8新特性、哈希冲突、HashMap原理、线程安全、Linux查询命令、Hadoop节点)

    面试涉及问题含有: Java JDK8新特性 集合(哈希冲突.HashMap的原理.自动排序的集合TreeSet) 多线程安全问题 String和StringBuffer JVM 原理.运行流程.内部 ...

  4. JDK8 新特性

    JDK8 新特性目录导航: Lambda 表达式 函数式接口 方法引用.构造器引用和数组引用 接口支持默认方法和静态方法 Stream API 增强类型推断 新的日期时间 API Optional 类 ...

  5. JDK8新特性关于Stream流

    在Java1.8之前还没有stream流式算法的时候,我们要是在一个放有多个User对象的list集合中,将每个User对象的主键ID取出,组合成一个新的集合,首先想到的肯定是遍历,如下: 1 2 3 ...

  6. java进阶一之jdk8新特性

    1.官方发布的jdk8新特性 2.51CTO相关专题

  7. 深入理解java虚拟机---jdk8新特性(二)

    1.jdk8新特性 1.新特性 2.lambda函数表达式的作用 A: 替换内部类 B:对集合的操作并行化

  8. 乐字节-Java8新特性之Optional

    上一篇小乐带大家了解了Java新特性之Stream,接下来将会继续述说Java新特性之Optional Optional<T>类(java.util.Optional)是一个容器类,代表一 ...

  9. JDK8新特性:使用stream、Comparator和Method Reference实现集合的优雅排序

    大家对java接口Comparator和Comparable都不陌生,JDK8里面Comparable还和以前一样,没有什么改动:但是Comparator在之前基础上增加了很多static和defau ...

随机推荐

  1. css3 盒模型与 伪元素综合应用案例

    先来简略理解下盒模型: 在 css3 之前,盒模型默认为 box-sizing : content-box,这种模式下的盒模型计算大小方式为,width + padding + border : 而 ...

  2. Config JAVA evironment for LoadRunner

    1. Install jdk 2. Set system variables eg. JAVA_HOME = C:\Program Files (x86)\Java\jdk1.6.0_43 class ...

  3. CF1158C

    题意:有排列p, 令\(nxt_i\)为\(p_i\)右侧第一个大于\(p_i\)的数的位置,若不存在则\(nxt_i=n+1\) 现在整个p和nxt的一部分丢失了,请根据剩余的nxt,构造出一个符合 ...

  4. dwr中的部分问题和总结

    2015-9-1 1.dwr设置同步异步:DWREngine.setAsync(false);//dwr设置为同步 --->使用目的是堵塞js,因为设置这样是为了js进行java的后台数据获取. ...

  5. Python之os.path.join()

    os.path.join()函数用于路径拼接文件路径. os.path.join()函数中可以传入多个路径: 会从第一个以”/”开头的参数开始拼接,之前的参数全部丢弃. 以上一种情况为先.在上一种情况 ...

  6. Linux使用yum install 安装程序时,提示“另外一个程序锁定了 yum;等待它退出……”

    Linux使用yum install 安装程序时,提示“另外一个程序锁定了 yum:等待它退出……” 原因: yum命令一次只能安装一个软件,所以当你下载安装第二个软件包时,系统进程锁会锁定yum,这 ...

  7. vue PC端页面引入vue-quill-editor富文本插件

    项目需要:在添加新类别的弹框中,要在输入框中输入多条描述信息,不同的描述信息要换行输入,输入后点击确定传给后端,接口返回成功后点击查看刚添加的新类别时,描述框中展现多条换行的描述信息也要跟填写时一样( ...

  8. ASE——第一次结对作业

    ASE--第一次结对作业 问题定义 很早就听说了MSRA的黄金点游戏,让大家写Bot来参加比赛看谁的AI比较聪明可以操盘割韭菜.深感ASE课程老师设计的任务太用心了,各种接口都准备好了,大家只用专注于 ...

  9. logo的普遍写法

    h1为了搜索引擎优化<div class="logo"> <h1> <a href="#">XX</a> < ...

  10. Vue学习笔记【2】——Vue指令之 - v-cloak、v-text和v-html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...