公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
程序猿要与时俱进!JDK11都出来了你还要守着jdk6和7?当你认为JDK8有BUG的时候你可曾知道当初JDK6、JDK7也是这样过来的!
最近我要批评一些人了!在我遇到的一些菜鸟当中,问他会不会JDK8中的Optional?他说不会!我说你为什么不学!他说以后再,JDK8现在用的企业不是很多,还可能存在一些未知的BUG!
我当场就想要骂人了,你活该做菜鸟!
回归主题,我希望关注我的还不会 Optional 的网友,通过这篇文章可以教育你的同事!
每个接触 JAVA 的程序员可能都遇到过 NPE(NullPointerException) 问题。JDK8 为了帮助我们很好的避免了这一现象,推出了 Optiona 功能,它是一个新特性。我们一起来看看它的相关用法!
of/empty/ofNullable
Xttblog xttblog = null;// xttblog 是一个 空对象
/**
* 源码:
* public static <T> Optional<T> of(T value) {//of会创建一个 实例化一个 Optional
* return new Optional<>(value);
* }
* private Optional(T value) { //检查value是否为null
* this.value = Objects.requireNonNull(value);
* }
* public static <T> T requireNonNull(T obj) { //不做解释了...
* if (obj == null)
* throw new NullPointerException();
* return obj;
* }
* 解释: 如果对象为Null使用of会抛出java.lang.NullPointerException
*/
Optional<Xttblog> op1 = Optional.of(xttblog);
Optional<Xttblog> op2 = Optional.empty();//看API就知道啥意思了,基本没什么太大卵用
/**
* 源码:
* public static <T> Optional<T> ofNullable(T value) {
* return value == null ? empty() : of(value);
* }
* 解释: 如果对象为空就返回 empty() 相反就 调用 of(value);
*/
Optional<Xttblog> op3 = Optional.ofNullable(xttblog);
get/isPresent
Optional<Xttblog> op = Optional.ofNullable(null);//创建一个对象为Null的Optional
/**
* 源码:
* public boolean isPresent() {
* return value != null;
* }
* 解释: 因为 value == null 源码是 value != null 因此返回false
*/
System.out.println(op.isPresent());
/**
* 源码:
* public T get() {
* if (value == null) {
* throw new NoSuchElementException("No value present");
* }
* return value;
* }
* 解释: 如果 value 为空 null 抛出 NoSuchElementException 否则返回 T
*/
System.out.println(op.get());
orElse/orElseGet/orElseThrow
Xttblog xttblog = null;
/**
* 源码:
* public T orElseGet(Supplier<? extends T> other) {
* return value != null ? value : other.get();
* }
* 解释: 对象为空返回null,否则返回对象
*/
Xttblog s1 = Optional.ofNullable(xttblog).orElseGet(Xttblog::new);
System.out.println(s1);
/**
* 源码:
* public T orElse(T other) {
* return value != null ? value : other;
* }
* 解释: 如果 T 为null则返回一个默认值
*/
Xttblog s2 = (Xttblog) Optional.ofNullable(xttblog).orElse(new Xttblog());
System.out.println(s2);
/**
* 源码:
* public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
* if (value != null) {
* return value;
* } else {
* throw exceptionSupplier.get();
* }
* }
* 解释: 如果T为null那么抛出异常(本宝宝非常喜欢)
*/
Xttblog s3 = Optional.ofNullable(xttblog).orElseThrow(() -> new RuntimeException("www.xttblog.com"));
System.out.println(s3);//抛出:java.lang.RuntimeException: www.xttblog.com
fiter/map
//可以加if判断条件过滤
String filter = Optional.ofNullable("业余草").filter((value) -> value.length() > 5).get();
System.out.println(filter);
//大小写转换等等..
String map = Optional.ofNullable("www.xttblog.com").map(String::toUpperCase).get();
System.out.println(map);
Optional转集合
Optional是一个集合,虽然里面只有0或者1个元素,但它一样是一个集合。如果要转为List或者Set,一可以有如下几种做法:
public static <T> List<T> toList(Optional<T> option) {
return option.
map(Collections::singletonList).
orElse(Collections.emptyList());
}
//或者更传统的写法:
public static <T> List<T> toList(Optional<T> option) {
if (option.isPresent())
return Collections.singletonList(option.get());
else
return Collections.emptyList();
}
//但是在java8里,其实只需要这么写:
import static java.util.stream.Collectors.*;
//转为List
List<String> list = collect(opt, toList());
//转为Set
Set<String> set = collect(opt, toSet());
其实就这么简单,你干嘛要给自己找借口呢?你说是不是!多学点知识没害处!

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » 还不会Optional?美其名曰JDK8有bug?