(1) 这个Optional.of方法还是不接收null作为输入参数:

而Optional.ofNullable可以接收null参数:

isPresent判断有无数据,这个没啥可以说的:

如果Optional容器包含的值不是null,执行action.

orElse: 如果Optional对象存在,返回原始对象,否则返回orElse里构造的新对象:

上图84行的getName其实是一个映射器,将Person对象映射成String.

在debugger里看到这个mapper实际上是个Lambda Function:

结果是包裹类型为映射函数的第二个参数:

ifPresent的参数是一个action:

我的测试代码:

package optionalTest;import java.util.Optional;
import java.util.function.Function;public class OptionalTest {class Person {private String mName;private Skill mSkill;public Person(String name) {mName = name;}public Skill getSkill(){return mSkill;}public Optional<Skill> getSkillOptional(){return Optional.ofNullable(mSkill);}public void setSkill(Skill skill){mSkill = skill;}public String getName() {return mName;}public void greet() {System.out.println("I am: " + mName);}}class Skill{private String mName;private int mLevel;public Skill(String name, int level) {mName = name;mLevel = level;}public void display(){System.out.println("Skill: " + mName + " level: " + mLevel);}}@SuppressWarnings("unused")public void scenario1(){Person person = null;try {Optional<Person> p1 = Optional.of(person);}catch ( Exception e) {System.out.println("Error: " + e.getClass().getName() + " - " + e.getLocalizedMessage());}Optional<Person> p2 = Optional.ofNullable(person);System.out.println(p2.isPresent());Person jerry = new Person("Jerry");Optional<Person> p3 = Optional.ofNullable(jerry);System.out.println(p3.isPresent());System.out.println("p2 test");p2.ifPresent((p) -> p.greet());System.out.println("p3 test");p3.ifPresent((p) -> p.greet());System.out.println("Example 3");// before Jave8Person oldImplementation = ( person  != null? person:new Person("Ji")); Person newPerson = p2.orElse(new Person("Ji"));Person existPerson = p3.orElse(new Person("Mr Unknown"));newPerson.greet();existPerson.greet();if( jerry != null && jerry.getName().equals("Jerry")) {System.out.println("old style-> Jerry found: " + jerry.getName());}p3.filter( personHolder -> "Jerry".equals(personHolder.getName())).ifPresent((personH2) -> System.out.println("new style-> Jerry found: " + personH2.getName()));Function<Person,String> mapper = Person::getName;Optional<String> mapResult = p3.map(mapper);p3.map(Person::getName).filter( Name -> "Jerry".equals(Name)).ifPresent( foundName -> System.out.println("new style 2-> Jerry found: " + foundName));/*jerry.setSkill("JavaScript");Optional<String> jerrySkill = p3.map(Person::getSkill);System.out.println(jerrySkill.isPresent());p3.map(Person::getSkill).filter(Skill -> "JavaScript".equals(Skill)).ifPresent( Skill2 -> System.out.println("Jerry's skill is: " + Skill2 )  );*/Skill jsSkill = new Skill("JavaScript", 80);jerry.setSkill(jsSkill);Optional<Skill> temp = p3.map(Person::getSkill); Optional<Skill> temp2 = p3.flatMap(Person::getSkillOptional);Skill s1 = temp.get();Skill s2 = temp2.get();s1.display();s2.display();}public static void main(String[] args) {OptionalTest test = new OptionalTest();test.scenario1();}}

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

Java Optional学习笔记相关推荐

  1. Java NIO 学习笔记(三)----Selector

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  2. 可能是最全面的 Java G1学习笔记

    转载自 可能是最全面的 Java G1学习笔记 引子 最近遇到很多朋友过来咨询G1调优的问题,我自己去年有专门学过一次G1,但是当时只是看了个皮毛,因此自己也有不少问题.总体来讲,对于G1我有几个疑惑 ...

  3. 深入浅出 Java CMS 学习笔记

    转载自  深入浅出 Java CMS 学习笔记 引子 带着问题去学习一个东西,才会有目标感,我先把一直以来自己对CMS的一些疑惑罗列了下,希望这篇学习笔记能解决掉这些疑惑,希望也能对你有所帮助. 1. ...

  4. Java NIO学习笔记之图解ByteBuffer

    转载自 Java NIO学习笔记之图解ByteBuffer ByteBuffer前前后后看过好几次了,实际使用也用了一些,总觉得条理不够清晰. <程序员的思维修炼>一本书讲过,主动学习,要 ...

  5. 转载:mongoDB java驱动学习笔记

    http://www.blogjava.net/watchzerg/archive/2012/09/22/388346.html mongoDB java驱动学习笔记 指定新mongo实例: Mong ...

  6. 2019年Java Web学习笔记目录

    Java Web学习笔记目录 1.Java Web学习笔记01:动态网站初体验 2.Java Web学习笔记02:在Intellij里创建Web项目 3.Java Web学习笔记03:JSP元素 4. ...

  7. 【Java基础学习笔记】- Day11 - 第四章 引用类型用法总结

    Java基础学习笔记 - Day11 - 第四章 引用类型用法总结 Java基础学习笔记 - Day11 - 第四章 引用类型用法总结 4.1 class作为成员变量 4.2 interface作为成 ...

  8. Java 虚拟机学习笔记 | 类加载过程和对象的创建流程

    前言 创建对象是 Java 语言绕不开的话题,那么对象是如何创建出来的呢?我们今天就来聊一聊.对象创建第一步就是检查类是否加载,而类的加载又牵扯到类的加载过程.如果单说对象的创建而绕开类的加载过程,感 ...

  9. Java中大数据数组,Java基础学习笔记之数组详解

    摘要:这篇Java开发技术栏目下的"Java基础学习笔记之数组详解",介绍的技术点是"java基础学习笔记.基础学习笔记.Java基础.数组详解.学习笔记.Java&qu ...

最新文章

  1. 2022年AI芯片场景
  2. python日期时间
  3. spring框架ioc(控制反转)第二讲
  4. ajax mysql项目 react_React视频教程来啦,每周末都有前端视频教程学
  5. distcc源码研究三
  6. 点击按钮创建一个表格 点击按钮创建一个表格 权限选择 元素的value属性操作
  7. source code of MES Data
  8. appium入门篇(2)--desired capabilities
  9. C++11中thread库join和detach的区别
  10. 安卓使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)
  11. 支付宝和微信支付用户付款码条码规则
  12. ps在线版 Photoshop在线精简版-toolfk程序员在线工具网
  13. seajs学习(1)----什么是系统
  14. 爬虫小程序 - 单词量测试
  15. uni-app 170邀请加入群聊(二)
  16. 【读后感】《清单革命》读书笔记
  17. pycharm批量注释
  18. 机器学习如何驱动业务实践?你想知道的都在这!
  19. 一分钟搞定最长公共子序列与最长公共子串的问题
  20. Spring属性注入的三种方式(超详细)

热门文章

  1. 网信金融 与 金银猫合作
  2. LINUX下使用https访问站点
  3. IL系列文章之二:Make Best Use of Our Tools
  4. SSM中抛出异常 java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoad
  5. [Python3] 015 冰冻集合的内置方法
  6. 修改 VS2013 项目属性的默认包含路径(全局)
  7. mac搭建PHP开发环境
  8. 解决Visual Studio “无法导入以下密钥文件”的错误
  9. python的os.path.join
  10. MYSQL 从头开始-1