八、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. TabTopAutoLayout【自定义顶部选项卡区域(带下划线)(动态选项卡数据且可滑动)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 自定义顶部选项卡布局LinearLayout类,实现带下划线且可滑动效果.[实际情况中建议使用RecyclerView] 备注:如果 ...

  2. dotnet core开源博客系统XBlog介绍

    XBlog是dotnet core平台下的个人博客开源系统,它只需要通过Copy的方式即可以部署到Linux和windows系统中:如果你有安全证书那只需要简单配置一下即可提供安全的Https服务.接 ...

  3. MySQL性能基准测试对比:5.7 VS 8.0

    本文由云+社区发表 作者:数据库 版权声明:本文由腾讯云数据库产品团队整理,页面原始内容来自于severalnines英文官网,若转载请注明出处.翻译目的在于传递更多全球最新数据库领域相关信息,并不意 ...

  4. There was a problem with the instance info replicator

    There was a problem with the instance info replicator 错误原因: 该服务尝试将自己作为客服端注册 解决办法: 在application.yml配置 ...

  5. 【Oracle学习笔记】序列

    Oracle提供了sequence对象,由系统提供自增长的序列号,通常用于生成数据库数据记录的自增长主键或序号的地方,一般结合触发器使用. Sequence是数据库系统的特性,有的数据库有Sequen ...

  6. IT企业级应⽤开发模式演化

    前端研发流程 传统To B类系统的研发模式 探索 & 思考设计模式库(DPL)设计语⾔设计语⾔详解基于MVVM模式的Web框架 & UI库优化后的开发模式实现价值实践 赋能 赋能授权( ...

  7. while,for,if输入账号密码判断(还请各位大牛能够优化,本人刚学习一周)

    AccountNumber1 = [] password1 = [] flag = True while flag: num = 0 a = 1 print('-----------这是个欢迎界面-- ...

  8. 倒计时5S秒自动关闭弹窗

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. Vue slot插槽

    插槽用于内容分发,存在于子组件之中. 插槽作用域 父级组件作用域为父级,子级组件作用域为子级,在哪定义的作用域就在哪. 子组件之间的内容是在父级作用域的,无法直接访问子组件里面的数据. 插槽元素 &l ...

  10. animate-queue和step-animate

    Step-animate: 分为3部分:{配置},{step:function(){...},duration:1000} <div id="warpper" style=& ...