转载自 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相关推荐

  1. JDK8新特性之Optional类

    Optional类 到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因.以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检 ...

  2. JDK8新特性详解Lambda、StreamAPI、Optional等

    JDK8学习笔记 学习视频地址:https://www.bilibili.com/video/BV1k64y1R7sA 操作代码:https://gitee.com/rederic/study-jdk ...

  3. Jdk8新特性一:jdk8新特性之default关键字、日期类、Base64类、Optional

    Jdk8新特性一:jdk8新特性之default关键字.日期类.Base64类.Optional 文章目录 Jdk8新特性一:jdk8新特性之default关键字.日期类.Base64类.Option ...

  4. JDK8新特性-Optional类

    个人简介 作者是一个来自河源的大三在校生,以下笔记都是作者自学之路的一些浅薄经验,如有错误请指正,将来会不断的完善笔记,帮助更多的Java爱好者入门. 文章目录 个人简介 JDK8新特性-Option ...

  5. Java番外篇2——jdk8新特性

    Java番外篇2--jdk8新特性 1.Lambda 1.1.无参无返回值 public class Test {interface Print{void print();}public static ...

  6. JDK8新特性知识点总结

    一个简洁的博客网站:http://lss-coding.top,欢迎大家来访 学习娱乐导航页:http://miss123.top/ 1. Open JDK 和 Oracle JDK Java 由 S ...

  7. 3.1_28_4 JDK8新特性【Date】之ZoneId 时区信息

    相关链接 Excel目录 JavaSE-JDK8新特性 P1 [Lambda表达式] JavaSE-JDK8新特性 P2 [Stream流]操作集合 JavaSE-JDK8新特性 P3 [Option ...

  8. 【JavaSE之JDK8新特性】三万字详文带你了解JDK8新特性

    JDK8新特性 一.Lambda 1.1需求分析 2.Lambda表达式的初级体验 3.Lambda表达式的语法规则 3.1.Lambda练习1 3.2.Lambda表达式练习2 4.Function ...

  9. 【JDK8 新特性 6】收集Stream流中的结果

    上一篇文章 : (9条消息) [JDK8 新特性 5]Stream流介绍和常用方法的使用_一切总会归于平淡的博客-CSDN博客 目录 1.Stream流中的结果到集合中 2.Stream流中的结果到数 ...

最新文章

  1. 如何使用python批量下载-用Python调用迅雷实现后台批量下载
  2. Android学习网站
  3. android 可行性分析,可行性研究项目分析程序与步骤
  4. Django_form补充
  5. 43岁被裁员,200万年薪泡汤:这4件事你要尽早明白
  6. [白开水]-maven的命令程序mvn脚本分析
  7. 此“小霸王”非彼小霸王?官方声明:小霸王并未破产!
  8. infinitescroll php,WordPress: 增加无限分页(Infinite Scroll)功能
  9. vnpy通过jqdatasdk初始化实时数据及历史数据下载
  10. 在可部署到brew真机上的程序包构建完之后又要如何将该程序包发布到真机上呢...
  11. Centos6.9编译安装nginx1.14.0
  12. 华东师范大学2019年数学分析考研试题
  13. n分频器 verilog_verilog 语言实现任意分频
  14. 关系抽取论文阅读笔记
  15. 小众绿软|媒体:Soprano Audio Player v1.60
  16. 佑道医生集团获风和资本数千万A轮投资,6个月实现盈亏平衡
  17. proe常用c语言语句,带你轻松搞懂Proe条件语句
  18. 亚马逊erp系统亚马逊FBA系统货代仓储打包系统
  19. 微信小程序学习-组件Map-地图初始定位
  20. 飞船撞击到外星人后,返回不了底部中央,只能手动设置参数,明天好好研究一下

热门文章

  1. [C++11]可调用对象包装器function
  2. 十一届蓝桥杯国赛 本质上升序列-dp
  3. word文档相关使用
  4. Tree Recovery(二叉树递归遍历+求后序遍历模板)
  5. Linux 脚本修改ini,Shell脚本读取ini配置文件的实现代码2例
  6. Sprig boot自动配置
  7. cf375D. Tree and Queries
  8. 牛客网专题 概率dp
  9. 2020牛客暑期多校训练营(第二场)
  10. 学习KMP (概念 + 模板 + 例题: 子串查找)