还不会Optional?美其名曰JDK8有bug?

业余杂谈 herman 457浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

程序猿要与时俱进!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)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 还不会Optional?美其名曰JDK8有bug?