JDK8新特性之Optional
转载自 JDK8新特性之Optional
Optional是什么
java.util.Optional
Jdk8提供 Optional
,一个可以包含null值的容器对象,可以用来代替xx != null的判断。
Optional常用方法
of
public static <T> Optional<T> of(T value) {return new Optional<>(value);
}
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);
}
static <T> Optional<T> ofNullable(T value) {return value == null ? empty() : of(value);
}
为value创建一个Optional对象,但可以允许value为null值。
isPresent
public boolean isPresent() {return value != null;
}
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);
}
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;
}
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;
}
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();
}
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();}
}
<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);//NullPointerExceptionif (userOptional2.isPresent()) {System.out.println("user is not null");}} catch (Exception e) {e.printStackTrace();}System.out.println();
}
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);//NullPointerExceptionif (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系列文章。
JDK8新特性之Optional相关推荐
- JDK8新特性之Optional类
Optional类 到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因.以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检 ...
- JDK8新特性详解Lambda、StreamAPI、Optional等
JDK8学习笔记 学习视频地址:https://www.bilibili.com/video/BV1k64y1R7sA 操作代码:https://gitee.com/rederic/study-jdk ...
- Jdk8新特性一:jdk8新特性之default关键字、日期类、Base64类、Optional
Jdk8新特性一:jdk8新特性之default关键字.日期类.Base64类.Optional 文章目录 Jdk8新特性一:jdk8新特性之default关键字.日期类.Base64类.Option ...
- JDK8新特性-Optional类
个人简介 作者是一个来自河源的大三在校生,以下笔记都是作者自学之路的一些浅薄经验,如有错误请指正,将来会不断的完善笔记,帮助更多的Java爱好者入门. 文章目录 个人简介 JDK8新特性-Option ...
- Java番外篇2——jdk8新特性
Java番外篇2--jdk8新特性 1.Lambda 1.1.无参无返回值 public class Test {interface Print{void print();}public static ...
- JDK8新特性知识点总结
一个简洁的博客网站:http://lss-coding.top,欢迎大家来访 学习娱乐导航页:http://miss123.top/ 1. Open JDK 和 Oracle JDK Java 由 S ...
- 3.1_28_4 JDK8新特性【Date】之ZoneId 时区信息
相关链接 Excel目录 JavaSE-JDK8新特性 P1 [Lambda表达式] JavaSE-JDK8新特性 P2 [Stream流]操作集合 JavaSE-JDK8新特性 P3 [Option ...
- 【JavaSE之JDK8新特性】三万字详文带你了解JDK8新特性
JDK8新特性 一.Lambda 1.1需求分析 2.Lambda表达式的初级体验 3.Lambda表达式的语法规则 3.1.Lambda练习1 3.2.Lambda表达式练习2 4.Function ...
- 【JDK8 新特性 6】收集Stream流中的结果
上一篇文章 : (9条消息) [JDK8 新特性 5]Stream流介绍和常用方法的使用_一切总会归于平淡的博客-CSDN博客 目录 1.Stream流中的结果到集合中 2.Stream流中的结果到数 ...
最新文章
- 如何使用python批量下载-用Python调用迅雷实现后台批量下载
- Android学习网站
- android 可行性分析,可行性研究项目分析程序与步骤
- Django_form补充
- 43岁被裁员,200万年薪泡汤:这4件事你要尽早明白
- [白开水]-maven的命令程序mvn脚本分析
- 此“小霸王”非彼小霸王?官方声明:小霸王并未破产!
- infinitescroll php,WordPress: 增加无限分页(Infinite Scroll)功能
- vnpy通过jqdatasdk初始化实时数据及历史数据下载
- 在可部署到brew真机上的程序包构建完之后又要如何将该程序包发布到真机上呢...
- Centos6.9编译安装nginx1.14.0
- 华东师范大学2019年数学分析考研试题
- n分频器 verilog_verilog 语言实现任意分频
- 关系抽取论文阅读笔记
- 小众绿软|媒体:Soprano Audio Player v1.60
- 佑道医生集团获风和资本数千万A轮投资,6个月实现盈亏平衡
- proe常用c语言语句,带你轻松搞懂Proe条件语句
- 亚马逊erp系统亚马逊FBA系统货代仓储打包系统
- 微信小程序学习-组件Map-地图初始定位
- 飞船撞击到外星人后,返回不了底部中央,只能手动设置参数,明天好好研究一下