八、Optional 类

1、 作用:可以存放空指针null,主要用于解决空指针问题。

2、 使用方法

1) 创建对象(2种方法)

Optional optional = Optional.of(非null对象);

或者

Optional optional = Optional.ofNullable(任何对象);

2) 判断对象是否为null(1种方法)

Optional对象.isPresent();

3) 获取对(3种方法)

Optional对象.get();

Optional对象.orElse()

Optional对象.orElseGet();

例子:

  1. package com.lennar.jdk8learn.learn;
  2.  
  3. import lombok.AllArgsConstructor;
  4. import lombok.Data;
  5. import lombok.NoArgsConstructor;
  6. import org.junit.Test;
  7.  
  8. import java.util.Optional;
  9. import java.util.function.BiFunction;
  10.  
  11. public class LearnOptional {
  12.     @Test
  13.     public void test() {
  14.         //1.创建
  15.         try {
  16.             Optional<Teacher> optional1 = Optional.of(null);//如果是null,则报空指针异常的错误
  17.         } catch (Exception e) {
  18.             System.out.println("optional1报错:" + e.toString());
  19.         }
  20.         try {
  21.             Optional<Teacher> optional2 = Optional.ofNullable(null);//允许存放null,不会报空指针的错误
  22.         } catch (Exception e) {
  23.             System.out.println("optional1报错:" + e.toString());
  24.         }
  25.         //2.空指针判断
  26.         Optional<Teacher> optional3 = Optional.ofNullable(null);
  27.         if (!optional3.isPresent()) {//null时返回false,非null时返回true
  28.             System.out.println("这个是null");
  29.         }
  30.         Optional<String> optional4 = Optional.ofNullable(new String(""));
  31.         if (!optional4.isPresent()) {//null时返回false,非null时返回true
  32.             System.out.println("这个是null");
  33.         } else {
  34.             System.out.println("这个不是null");
  35.         }
  36.         //3.获取Optional中的对象
  37.         try {
  38.             Teacher t0 = optional3.get();//确定有对象时返回对象,否则报空指针异常的错
  39.             System.out.println(t0);
  40.         } catch (Exception e) {
  41.             System.out.println("optional3中没有对象,为null");
  42.         }
  43.         Optional<Teacher> optional5 = Optional.ofNullable(new Teacher("1", "张三"));
  44.         Teacher t1 = optional5.get();
  45.         System.out.println(t1);
  46.  
  47.         Teacher t2 = optional3.orElse(new Teacher("2", "李四"));//对象非空返回对象,否则返回默认值(类型一致,在orElse中的值就是默认值)
  48.         System.out.println(t2);
  49.         Teacher t3 = optional5.orElse(null);
  50.         System.out.println(t3);
  51.  
  52.         Teacher t4 = optional3.orElseGet(() -> {//对象非空返回对象,否则调用orElseGet中的方法返回同类型的默认对象
  53.             String id = "3";
  54.             String name = "王五";
  55.             BiFunction<String, String, Teacher> function = Teacher::new;
  56.             return function.apply(id, name);
  57.         });
  58.         System.out.println(t4);
  59.         Teacher t5 = optional5.orElseGet(() -> {
  60.             String id = "4";
  61.             String name = "赵六";
  62.             BiFunction<String, String, Teacher> function = Teacher::new;
  63.             return function.apply(id, name);
  64.         });
  65.         System.out.println(t5);
  66.  
  67.     }
  68. }
  69.  
  70. @Data
  71. @AllArgsConstructor
  72. @NoArgsConstructor
  73. class Teacher {
  74.     private String id;
  75.     private String name;
  76. }

(八)jdk8学习心得之Optional类的更多相关文章

  1. (六)jdk8学习心得之Stream流

    六.Stream流 1. 什么是stream流 现阶段,可以把stream流看成一个高级版的Iterator.普通的Iterator只能实现遍历,遍历做什么,就需要具体些功能代码函数了.而这个stre ...

  2. (五)jdk8学习心得之默认方法

    五.默认方法 1. 使用方法:写在接口中,就是为了接口可以做一些事情. 2. 目的:有很多实现类,有一个公共的抽象方法,其实这些实现类实现该抽象方法的内容是完全一致的,完全没有必要都重新实现一遍.并且 ...

  3. (二)jdk8学习心得之Lambda表达式

    二.Lambda表达式 1. 格式 (参数1,参数2,…,参数n)->{方法体} 注意: (参数1,参数2,...,参数n)要与方法接口中的参数一致,但是名字可以不一样. 此外,方法类型接口,有 ...

  4. (一)jdk8学习心得之遍历

    一.遍历 -- 最好和stream流连用 使用jdk8提供的forEach进行遍历时,采用的是多线程的操作,理论上讲是会比原来的方法更快.但是注意,系统启动时需要加载lambda框架的内容.因此如果通 ...

  5. (七)jdk8学习心得之join方法

    七.join方法 1. 作用:将list或者数组按照连接符进行连接,返回一个字符串. 2. 使用方法 1) String.join(“连接符”,数组对象或者list对象) 2) 首先转换成stream ...

  6. (四)jdk8学习心得之函数式接口

    四.函数式接口 1. 格式 注:抽象方法就是通过lambda表达式或者方法引用实现. 2. Jdk提供的函数式接口(这里提供五个最为常用的) 3. 技巧 通过函数式接口,就可以把一个函数作为一个参数进 ...

  7. (三)jdk8学习心得之方法引用

    三.方法引用 https://www.jianshu.com/p/c9790ba76cee 这边博客写的很好,可以首先阅读,在这里感谢这篇文章的博主. 1. 格式 调用者::调用者具备的方法名 2. ...

  8. 我的MYSQL学习心得(八) 插入 更新 删除

    我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得( ...

  9. 我的MYSQL学习心得(八)

    原文:我的MYSQL学习心得(八) 我的MYSQL学习心得(八) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYSQL ...

随机推荐

  1. 使用Identity Server 4建立Authorization Server (4)

    预备知识: http://www.cnblogs.com/cgzl/p/7746496.html 第一部分: http://www.cnblogs.com/cgzl/p/7780559.html 第二 ...

  2. 《HelloGitHub》第 29 期

    公告 月刊现已支持 RSS 订阅 <HelloGitHub>第 29 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. ...

  3. springboot~使用docker构建gradle项目

    这是一篇关系到四个知识点的文章,分别是java,docker,springboot和gradle,我们希望在java环境下,使用springboot框架,通过gradle去构建项目,然后把项目部署和运 ...

  4. 前端笔记之JavaScript面向对象(一)Object&函数上下文&构造函数&原型链

    一.对象(Object) 1.1 认识对象 对象在JS中狭义对象.广义对象两种. 广义:相当于宏观概念,是狭义内容的升华,高度的提升,范围的拓展.狭义:相当于微观概念,什么是“狭”?因为内容狭隘具体, ...

  5. 强化学习(七)时序差分离线控制算法Q-Learning

    在强化学习(六)时序差分在线控制算法SARSA中我们讨论了时序差分的在线控制算法SARSA,而另一类时序差分的离线控制算法还没有讨论,因此本文我们关注于时序差分离线控制算法,主要是经典的Q-Learn ...

  6. lib和dll文件的初了解

    lib,dll这两样东西在许多编程书中都很少出现,但实际工程中,这两样东西的作用确实非常重要,我觉得c++程序员都有必要了解这两样东西. 首先总共有 动态链接 和 静态链接 这两种链接方式 |静态链接 ...

  7. SLAM+语音机器人DIY系列:(一)Linux基础——1.Linux简介

    摘要 由于机器人SLAM.自动导航.语音交互这一系列算法都在机器人操作系统ROS中有很好的支持,所以后续的章节中都会使用ROS来组织构建代码:而ROS又是安装在Linux发行版ubuntu系统之上的, ...

  8. Java高阶语法---static

    背景:听说static Java高阶语法是挺进BAT必经之路. static: 静态static,很多时候会令我望文生义,但是get到了static最重要的一点,其他的理解都还ok. static最重 ...

  9. 关于时间的那些事--PHP、JavaScript、MySQL操作时间

    PHP篇 PHP中时间操作单位是秒 一.将时间戳转为普通日期格式 //当前时间戳 time(); //当前时间格式 date("Y-m-d H:i:s",time()); //昨天 ...

  10. 小游戏大智慧,10 个让人眼前一亮的 JavaScript 游戏

    摘要: JS还可以这么玩~ Fundebug经授权转载,版权归原作者所有. 这是一篇有趣的文章,我们精选了 JS13K 游戏编程挑战的优秀作品,与大家分享.JS13K 是专为 JavaScript 开 ...