八、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();

例子:

package com.lennar.jdk8learn.learn;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.junit.Test; import java.util.Optional;
import java.util.function.BiFunction; public class LearnOptional {
    @Test
    public void test() {
        //1.创建
        try {
            Optional<Teacher> optional1 = Optional.of(null);//如果是null,则报空指针异常的错误
        } catch (Exception e) {
            System.out.println("optional1报错:" + e.toString());
        }
        try {
            Optional<Teacher> optional2 = Optional.ofNullable(null);//允许存放null,不会报空指针的错误
        } catch (Exception e) {
            System.out.println("optional1报错:" + e.toString());
        }
        //2.空指针判断
        Optional<Teacher> optional3 = Optional.ofNullable(null);
        if (!optional3.isPresent()) {//null时返回false,非null时返回true
            System.out.println("这个是null");
        }
        Optional<String> optional4 = Optional.ofNullable(new String(""));
        if (!optional4.isPresent()) {//null时返回false,非null时返回true
            System.out.println("这个是null");
        } else {
            System.out.println("这个不是null");
        }
        //3.获取Optional中的对象
        try {
            Teacher t0 = optional3.get();//确定有对象时返回对象,否则报空指针异常的错
            System.out.println(t0);
        } catch (Exception e) {
            System.out.println("optional3中没有对象,为null");
        }
        Optional<Teacher> optional5 = Optional.ofNullable(new Teacher("1", "张三"));
        Teacher t1 = optional5.get();
        System.out.println(t1);         Teacher t2 = optional3.orElse(new Teacher("2", "李四"));//对象非空返回对象,否则返回默认值(类型一致,在orElse中的值就是默认值)
        System.out.println(t2);
        Teacher t3 = optional5.orElse(null);
        System.out.println(t3);         Teacher t4 = optional3.orElseGet(() -> {//对象非空返回对象,否则调用orElseGet中的方法返回同类型的默认对象
            String id = "3";
            String name = "王五";
            BiFunction<String, String, Teacher> function = Teacher::new;
            return function.apply(id, name);
        });
        System.out.println(t4);
        Teacher t5 = optional5.orElseGet(() -> {
            String id = "4";
            String name = "赵六";
            BiFunction<String, String, Teacher> function = Teacher::new;
            return function.apply(id, name);
        });
        System.out.println(t5);     }
} @Data
@AllArgsConstructor
@NoArgsConstructor
class Teacher {
    private String id;
    private String name;
}

(八)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. 【机器学习】--鲁棒性调优之L1正则,L2正则

    一.前述 鲁棒性调优就是让模型有更好的泛化能力和推广力. 二.具体原理 1.背景 第一个更好,因为当把测试集带入到这个模型里去.如果测试集本来是100,带入的时候变成101,则第二个模型结果偏差很大, ...

  2. Pycharm使用教程(四)-安装python依赖包(非常详细,非常实用)

    简介 在做python开发时,需要很多依赖包,如果已经安装pip,安装依赖包,可以通过命令行:没有安装的,也可以通过PyCharm安装. 具体安装步骤 1.在File->Setting,如图: ...

  3. IdentityServer4 中文文档与实战

    写在前面 写于2018.9.12 我研究 IdentityServer4 是从.net core 1.1的时候开始的,那时候国内的中文资料比较少,我都是按照官方文档来研究的,整理成了笔记.这个系列文档 ...

  4. 【Android Studio安装部署系列】二十五、Android studio使用NDK生成so文件和arr文件

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio使用ndk的简单步骤. NDK环境搭建 下载NDK 下载链接:https://developer.and ...

  5. Java进阶篇设计模式之三 ----- 建造者模式和原型模式

    前言 在上一篇中我们学习了工厂模式,介绍了简单工厂模式.工厂方法和抽象工厂模式.本篇则介绍设计模式中属于创建型模式的建造者模式和原型模式. 建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用 ...

  6. 基于.NetCore的Redis5.0.3(最新版)快速入门、源码解析、集群搭建与SDK使用【原创】

    1.[基础]redis能带给我们什么福利 Redis(Remote Dictionary Server)官网:https://redis.io/ Redis命令:https://redis.io/co ...

  7. SmartSql 动态代理仓储

    SmartSql 动态代理仓储,一个高生产力的组件.该组件看似很难懂,实际上仅做了映射Statement,转发请求的功能.但却意义重大. SmartSql提供了一个通用泛型仓储接口 SmartSql. ...

  8. ABAP案例:灵活读取SAP各表的数据

    案例说明     RFC读取表中数据. Import 参数名称 Type spec. 参考打印 FIELDS_NAME1 TYPE CHAR25 TABLE_NAME1 TYPE CHAR25 WHE ...

  9. SmartUpload工具包的中文乱码问题详解

    关于SmartUpload工具包的中文乱码问题,输出在服务端的中文显示是乱码,而英文数字,没有任何问题,我在网上看了其他人的问题和回答,让我觉得有道理,却又用不着,最后在多次试验中,终于找到了问题所在 ...

  10. :only-child和:only-of-type选择器的比较

    :only-child 当元素是唯一的子元素,被选择. HTML代码: <body> <div class="x"> <div>第一个DIV&l ...