美文网首页
JAVA8- Optional-用法浅析

JAVA8- Optional-用法浅析

作者: Raral | 来源:发表于2022-04-28 16:36 被阅读0次

JAVA8- Optional-用法浅析

简介

java8新引入optional特性,官方说法是更优雅的处理空指针异常,用来表示一个变量值可以为空也可以不为空,此处引用java8实战里面描述:

在你的代码中始终如一地使用Optional,能非常清晰地界定出变量值的缺失是结构上的问
题,还是你算法上的缺陷,抑或是你数据中的问题。另外,我们还想特别强调,引入Optional
类的意图并非要消除每一个null引用。与此相反,它的目标是帮助你更好地设计出普适的API,
让程序员看到方法签名,就能了解它是否接受一个Optional的值。这种强制会让你更积极地将
变量从Optional中解包出来,直面缺失的变量值

所以,optional的作用是显示的表达变量的状态,而不是为了完全消灭NPE(空指针)。

常见使用

public class Test {

    public static void main(String[] args) throws Exception {

        final Clazz clazz1 = new Clazz("1", "高一一班");
        final Student s1 = new Student("1", "张三", clazz1);
        final Student s2 = new Student("2", "李四", null);
        List<Student> students = ListUtil.of(s1, s2);
        final List<Student> emptyStudents = new ArrayList<>();
        final List<Student> nullStudents = null;

        //1. Optional.of: 参数必须不是null,否则PNE;
        // Optional.ofNullable: 参数可以是null,不会PNE;
        Optional<List<Student>> nullStudents1 = Optional.of(emptyStudents);
        Optional<List<Student>> nullStudents2 = Optional.ofNullable(nullStudents);

        //2. isPresent、ifPresent 不推荐使用
        final Optional<List<Student>> nullValue = Optional.ofNullable(nullStudents);

//        if (nullValue.isPresent()) {    System.out.println("value: " + nullValue.get());}
//        nullValue.ifPresent(value -> System.out.println("value: " + value));
//        isPresent判断的写法上是不是感觉很熟悉,感觉可以直接写为:
//        if (nullStudents != null) {    System.out.println("value: " + nullStudents);}


        //3. 值处理:map、flatMap 【推荐】
        //获取s2的班级名称, 类似 js 中的 a.b.c....
        //常规写法
        String name = "";
        if (s2 != null && s2.getClazz() != null) {
            Clazz clazz = s2.getClazz();
            if(clazz != null && clazz.getName() != null) {
                name = clazz.getName();
            }
        }

        String name2 = Optional.ofNullable(s1).map(Student::getClazz).map(Clazz::getName).orElse("默认班级名称");
        System.out.println("name:" + name);
        System.out.println("name2:" + name2);

        //4. 值为空的处理:orElse、orElseGet、orElseThrow : 【推荐】
        //orElse、orElseGet : 获取默认值
        //          orElse: 默认值
        Optional.ofNullable(s1).map(Student::getClazz).map(Clazz::getName).orElse("默认名称");
        //      orElseGet:  获取默认值函数
        Optional.ofNullable(s1).map(Student::getClazz).map(Clazz::getName).orElseGet(() -> null);
        //orElseThrow : 抛出自定义异常
        Optional.ofNullable(s1).map(Student::getClazz).map(Clazz::getName).orElseThrow(() -> new Exception("clazz对象为空"));


        //5. 条件过滤:filter
        //在集合中,找到 学生的班级为空的 学生id
        for (Student student : students) {
            Optional.of(student).filter(v -> v.getClazz() == null).ifPresent(v -> v.getId());
        }
    }

}

相关文章

  • JAVA8- Optional-用法浅析

    JAVA8- Optional-用法浅析 简介 java8新引入optional特性,官方说法是更优雅的处理空指针...

  • 浅析 go context

    浅析 go context 用法demo WithCancelfunc WithCancel(parent Con...

  • [Android] ButterKnifeProcessor 工

    前言 在 [Android] ButterKnife 浅析 中,我们了解了 ButterKnife 的用法,比较简...

  • 浅析Promise用法

    如需转载请注明来源 关键词:Promise,resolve,reject,Prepending,Resolve,R...

  • 浅析Promise用法

    转载自作者:枸杞辣条链接:https://www.jianshu.com/p/78c10239f852 Promi...

  • axios用法浅析

    axios的基本特性 1.支持浏览器和node.js2.支持promise3.能拦截请求和响应4.自动转换JSON...

  • 浅析ViewPager的用法

    ViewPager简介ViewPager是一个允许使用者左右滑动数据页面的布局管理器,通过一个适配器(PagerA...

  • 浅析reduce的用法

    reduce()方法相当于一个累加器的函数,所述阵列的每个值(从左到右)将其累计计算;*ie9以下的浏览器中,不支...

  • Swift 3.x 中 Strings/Characters 闲

    前言 本篇文章主要浅析字符串\字符在 Swift 和 Objective-C 之间的区别及其简单用法。如有不妥的地...

  • 浅析Kotlin协程用法

    协程是什么? 首先kotlin协程是kotlin的扩展库(kotlinx.coroutines)。 相信大家应该都...

网友评论

      本文标题:JAVA8- Optional-用法浅析

      本文链接:https://www.haomeiwen.com/subject/rredyrtx.html