概念:Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。
常用方法:Optional.of(T t) : 创建一个 Optional 实例Optional.empty() : 创建一个空的 Optional 实例Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例isPresent() : 判断是否包含值orElse(T t) : 如果调用对象包含值,返回该值,否则返回t orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()flatMap(Function mapper):与 map 类似,要求返回值必须是Optional

使用

// 准备一个实体类
public class Employee {private int id;private String name;private int age;private double salary;private Status status;public Employee() {}public Employee(int id, String name, int age, double salary, Status status) {this.id = id;this.name = name;this.age = age;this.salary = salary;this.status = status;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Employee employee = (Employee) o;return age == employee.age &&Double.compare(employee.salary, salary) == 0 &&Objects.equals(name, employee.name);}@Overridepublic int hashCode() {return Objects.hash(name, age, salary);}public Employee(String name, int age, double salary) {this.name = name;this.age = age;this.salary = salary;}public Employee(String name) {this.name = name;}public Employee(String name, Integer age) {this.name = name;this.age = age;}public Employee(String name, int age, double salary, Status status) {this.name = name;this.age = age;this.salary = salary;this.status = status;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}public Status getStatus() {return status;}public void setStatus(Status status) {this.status = status;}@Overridepublic String toString() {return "Employee{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", salary=" + salary +", status=" + status +'}';}public enum Status {FREE,BUSY,VOCATION}
}
 @Testpublic void test() {Optional<Employee> op = Optional.of(new Employee());Employee employee = op.get();System.out.println(employee);}

注意:往往实际应用中要传入数据,如果传入的为null,也会报空指针异常,但是这里是很明确的指出空指针的位置,要注意理解optional的思想


注意区分下面几个

// 不能构建null@Testpublic void test1() {Optional<Employee> employee = Optional.of(null);System.out.println(employee.get());}// 构建一个空null@Testpublic void test2() {Optional<Employee> employee = Optional.empty();System.out.println(employee.get());}// 是上面两个的综合public void test3() {Optional<Employee> employee = Optional.ofNullable(new Employee());System.out.println(employee.get());}

isPresent, 有值就执行,没值就什么都不做

orElse : 有值就用传的值,没值就用封装的值

@Testpublic void test4(){Optional<Employee> op = Optional.of(new Employee(101, "张三", 18, 9999.99));Optional<String> op2 = op.map(Employee::getName);System.out.println(op2.get());Optional<String> op3 = op.flatMap((e) -> Optional.of(e.getName()));System.out.println(op3.get());}

练习


// 准备两个实体
public class Man {private Godness god;public Man() {}public Man(Godness god) {this.god = god;}public Godness getGod() {return god;}public void setGod(Godness god) {this.god = god;}@Overridepublic String toString() {return "Man [god=" + god + "]";}}public class Godness {private String name;public Godness() {}public Godness(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Godness [name=" + name + "]";}}
@Testpublic void test5(){Man man = new Man();String name = getGodnessName(man);System.out.println(name);}//需求:获取一个男人心中女神的名字public String getGodnessName(Man man){if(man != null){Godness g = man.getGod();if(g != null){return g.getName();}}return "苍老师";}// 对于上面,需要在获取方法中大量的判断,产生大量垃圾代码// 下面改进

改进


//注意:Optional 不能被序列化
public class NewMan {private Optional<Godness> godness = Optional.empty();private Godness god;public Optional<Godness> getGod(){return Optional.of(god);}public NewMan() {}public NewMan(Optional<Godness> godness) {this.godness = godness;}public Optional<Godness> getGodness() {return godness;}public void setGodness(Optional<Godness> godness) {this.godness = godness;}@Overridepublic String toString() {return "NewMan [godness=" + godness + "]";}}
//运用 Optional 的实体类@Testpublic void test6(){Optional<Godness> godness = Optional.ofNullable(new Godness("林志玲"));Optional<NewMan> op = Optional.ofNullable(new NewMan(godness));String name = getGodnessName2(op);System.out.println(name);}public String getGodnessName2(Optional<NewMan> man){return man.orElse(new NewMan()).getGodness().orElse(new Godness("苍老师")).getName();}

Java8新特性-Optional类相关推荐

  1. Java8新特性 Optional类

    作为开发人员每天与NullPointerException斗智斗勇.每接收到参数或调用方法获得值得判断一下是否为null.稍不留意,空指针异常就像幽灵一样出现了.这篇文章我们来学习Java8是如何通过 ...

  2. Java8新特性——Optional 类

    文章目录 前言 Optional 类 1.概述 2.API介绍 of ofNullable empty isPresent get ifPresent orElse orElseGet orElseT ...

  3. Java8新特性Optional类

    这里写自定义目录标题 Java8 Optional 类 前言 创建 Optional 实例 Optional API常用接口的用法 get()方法 isPresent()方法 isPresent()方 ...

  4. java 8 optional 类,Java8新特性-Optional类

    Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念.并且可以避免空指 ...

  5. JDK8新特性-Optional类

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

  6. Java8新特性-Optional

    文章目录 简介 Optional源码分析和使用场景 属性和构造 常用方法 get()方法 isPresent()方法 ifPresent(Consumer<? super T> consu ...

  7. Java8新特性Optional、接口中的默认方法与静态方法

    Optional Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念 ...

  8. JAVA8新特性Optional和Stream和Localdate用法

    1.Optional类是Java8为了解决null值判断问题 2.Stream 是Java SE 8类库中新增的关键抽象,Java 8 引入的的Stream主要用于取代部分Collection的操作, ...

  9. Java8新特性-Optional,狂神说docker笔记百度云

    // 这个是通用的代表NULL值的Optional实例private static final Optional<?> EMPTY = new Optional<>();// ...

最新文章

  1. V2X 是自动驾驶重要基石,巨头纷纷抢滩布局
  2. SpringCloud学习(七)高可用的分布式配置中心(Spring Cloud Config)(Finchley版本)
  3. GetWindowRect GetClientRect
  4. Android 滑动效果基础篇(四)—— Gallery + GridView
  5. java在己有的类创子类怎么创_使用Java创建自己的异常子类...
  6. 久违的反省,容忍现在的自己
  7. 【笔记】spring定时器时间配置实例
  8. iOS HTML标签字符实体,转译字符串归类大全 【转载】
  9. CPU有个禁区,内核权限也无法进入!
  10. 【Kafka】kafka 客户端 控制台 flink 都无法消费的情况
  11. 如何解决使用webpack打包之后,font-awsome路径不对的问题,终极解决方法
  12. 5gh掌上云计算认证不通过_华为认证HCIE云计算难吗?
  13. window平台下php连接Oracle
  14. 使用Kali Linux系统生成木马病毒并实现远程控制计算机
  15. 用户旅程图进阶:实操与模板
  16. 简单个人网页制作 个人介绍网页模板 静态HTML留言表单页面网站模板 大学生个人主页网页
  17. Python之文件操作(常用操作)
  18. csp2021-12
  19. jekins 指定分支_jenkins的pipeline拉取指定分支的代码
  20. tar 命令打包压缩tar.gz,不包含当前文件夹路径

热门文章

  1. 简易php代码防止恶意刷新网站
  2. Photoshop小技巧 (去掉照片中多余的人物)
  3. 毕设之基金定投小程序
  4. 令人匪夷所思的 Magic 之魔数,你真的不会
  5. L9110电机驱动电路
  6. 详解服务器异构计算FPGA基础知识
  7. jme-旋转的双子星
  8. Linux发行版:CentOS、Ubuntu、RedHat、Android、Tizen、MeeGo
  9. 酷派大观4 8970 刷android 4.4,极速达百兆! 移动4G版酷派大观4网络体验
  10. 完美解决“未能装载Office文档控件。请使用Internet Explorer(6.0+)浏览器并检查浏览器的安全设置。”的方案