八、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. 面向对象(__item__)

    #Author : Kelvin #Date : 2019/1/20 21:37 class People: def __getitem__(self, item): print("geti ...

  2. spring里的三大拦截器

    Filter 新建 TimeFilter @Component public class TimeFilter implements Filter { @Override public void in ...

  3. QUIC协议原理分析(转)

    之前深入了解了一下HTTP1.1.2.0.SPDY等协议,发现HTTP层怎么优化,始终要面对TCP本身的问题.于是了解到了QUIC,这里分享一篇之前找到的有意义的文章. 原创地址:https://mp ...

  4. 一套代码小程序&Web&Native运行的探索06——组件系统

    接上文:一套代码小程序&Web&Native运行的探索05——snabbdom 对应Git代码地址请见:https://github.com/yexiaochai/wxdemo/tre ...

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

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

  6. Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)

    JVM运行时内存结构回顾 在JVM相关的介绍中,有说到JAVA运行时的内存结构,简单回顾下 整体结构如下图所示,大致分为五大块 而对于方法区中的数据,是属于所有线程共享的数据结构 而对于虚拟机栈中数据 ...

  7. Redis Cluster搭建高可用Redis服务器集群

    一.Redis Cluster集群简介 Redis Cluster是Redis官方提供的分布式解决方案,在3.0版本后推出的,有效地解决了Redis分布式的需求,当一个节点挂了可以快速的切换到另一个节 ...

  8. WinForm DataGridView实时更新表格数据

    前言 一个特殊的项目没有用第三方控件库,但用到了DataGridView,由于是客户端产生的数据,所以原始数据源就是一个集合. 根据需要会向集合中添加数据项,或是修改某些数据项的值,但DataGrid ...

  9. 基于mapnik做切片服务器的几点总结

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在地图服务器的整体方案中,移动端采用矢量切片,样式解析采用th ...

  10. (七) Keras 绘制网络结构和cpu,gpu切换

    视频学习来源 https://www.bilibili.com/video/av40787141?from=search&seid=17003307842787199553 笔记 首先安装py ...