首页 > 其他分享 >Optional

Optional

时间:2023-06-24 15:32:44浏览次数:32  
标签:Author author authorOptional getAuthor null Optional

代码写在course2中

1. 概述   37

我们在编写代码的时候出现最多的就是空指针异常。所以在很多情况下我们需要做各种非空的判断。

例如:

Author author = getAuthor();
        if(author!=null){
            System.out.println(author.getName());
        }

尤其是对象中的属性还是一个对象的情况下。这种判断会更多。

而过多的判断语句会让我们的代码显得臃肿不堪。

所以在JDK8中引入了Optional,养成使用Optional的习惯后你可以写出更优雅的代码来避免空指针异常。

并且在很多函数式编程相关的API中也都用到了Optional,如果不会使用Optional也会对函数式编程的学习造成影响。

2. 使用  38

2.1 创建对象   38

Optional就好像是包装类,可以把我们的具体数据封装Optional对象内部。然后我们去使用Optional中封装好的方法操作封装进去的数据就可以非常优雅的避免空指针异常。

我们一般使用Optional的静态方法ofNullable来把数据封装成一个Optional对象。无论传入的参数是否为null都不会出现问题。

Author author = getAuthor();
Optional<Author> authorOptional = Optional.ofNullable(author);
package com.sangeng;

import java.util.Optional;
import java.util.function.Consumer;

//演示Optional   38
public class OptionalDemo {

    public static void main(String[] args) {
        //创建Optional对象
        Author author = getAuthor();
        Optional<Author> authorOptional = Optional.ofNullable(author);
        authorOptional.ifPresent(author1 -> System.out.println(author1.getName()));
    }

    public static Author getAuthor(){
        Author author = new Author(1L,"蒙多",33,"一个从菜刀中明悟哲理的祖安人",null);
        return null;
    }
}

即使返回值是null也不会报错了

Optional_System

你可能会觉得还要加一行代码来封装数据比较麻烦。但是如果改造下getAuthor方法,让其的返回值就是封装好的Optional的话,我们在使用时就会方便很多。

将上面的代码改进

package com.sangeng;

import java.util.Optional;
import java.util.function.Consumer;

//演示Optional   38
public class OptionalDemo {

    public static void main(String[] args) {
        //创建Optional对象   38
        /*Author author = getAuthor();
        Optional<Author> authorOptional = Optional.ofNullable(author);
        authorOptional.ifPresent(author1 -> System.out.println(author1.getName()));*/

        //改进上面代码
        Optional<Author> authorOptional = getAuthor();
        authorOptional.ifPresent(author -> System.out.println(author.getName()) );

    }

    /*
    //创建Optional对象  38
    public static Author getAuthor(){
        Author author = new Author(1L,"蒙多",33,"一个从菜刀中明悟哲理的祖安人",null);
        return null;
    }*/
    //改进上面的代码   创建Optional对象  38
    public static Optional<Author> getAuthor(){
        Author author = new Author(1L,"蒙多",33,"一个从菜刀中明悟哲理的祖安人",null);
        return Optional.ofNullable(null);
    }

}

而且在实际开发中我们的数据很多是从数据库获取的。Mybatis从3.5版本可以也已经支持Optional了。我们可以直接把dao方法的返回值类型定义成Optional类型,MyBastis会自己把数据封装成Optional对象返回。封装的过程也不需要我们自己操作。

如果你确定一个对象不是空的则可以使用Optional的静态方法of来把数据封装成Optional对象。

Author author = new Author();
Optional<Author> authorOptional = Optional.of(author);

但是一定要注意,如果使用of的时候传入的参数必须不为null。(尝试下传入null会出现什么结果)

如果一个方法的返回值类型是Optional类型。而如果我们经判断发现某次计算得到的返回值为null,这个时候就需要把null封装成Optional对象返回。这时则可以使用Optional的静态方法empty来进行封装。

3. 安全消费值   39

我们获取到一个Optional对象后肯定需要对其中的数据进行使用。这时候我们可以使用其ifPresent方法对来消费其中的值。这个方法会判断其内封装的数据是否为空,不为空时才会执行具体的消费代码。这样使用起来就更加安全了。

例如

以下写法就优雅的避免了空指针异常。

Optional<Author> authorOptional = Optional.ofNullable(getAuthor());
authorOptional.ifPresent(author -> System.out.println(author.getName()));

4. 获取值

如果我们想获取值自己进行处理可以使用get方法获取,但是不推荐。因为当Optional内部的数据为空的时候会出现异常。

4.1 orElseGet   40

获取数据并且设置数据为空时的默认值。如果数据不为空就能获取到该数据。如果为空则根据你传入的参数来创建对象作为默认值返回。

// orElseGet 获取值  40
    private static void test01() {
        Optional<Author> authorOptional = getAuthor();
        //如果获取的值为null,就返回我们自己设置的默认值
        Author author = authorOptional.orElseGet(() -> new Author(2L,"中国",15,"你好世界",null));
        System.out.println(author.getName());
    }
// orElseGet 获取值  40
    public static Optional<Author> getAuthor(){
        Author author = new Author(1L,"蒙多",33,"一个从菜刀中明悟哲理的祖安人",null);
        return Optional.ofNullable(null);
    }

Optional_数据_02

4.2 orElseThrow   40

获取数据,如果数据不为空就能获取到该数据。如果为空则根据你传入的参数来创建异常抛出。

//获取数据,如果数据不为空就能获取到该数据。如果为空则根据你传入的参数来创建异常抛出。  40
    private static void test02() {
        Optional<Author> authorOptional = getAuthor();
        try {
            Author author = authorOptional.orElseThrow(() -> new RuntimeException("数据为null"));
            System.out.println(author);
        }catch (Throwable throwable){
            throwable.printStackTrace();
        }

    }

Optional_封装_03

4.3 过滤  41

我们可以使用filter方法对数据进行过滤。如果原本是有数据的,但是不符合判断,也会变成一个无数据的Optional对象。

//过滤方法   41
    private static void testFilter() {
        Optional<Author> authorOptional = getAuthor();
        authorOptional.filter(author -> author.getAge() > 18)
                .ifPresent(author -> System.out.println(author.getName()));
    }

Optional_optional_04

4.4 判断   42

我们可以使用isPresent方法进行是否存在数据的判断。如果为空返回值为false,如果不为空,返回值为true。但是这种方式并不能体现Optional的好处,更推荐使用ifPresent方法

//判断   42
    private static void testIspresent() {
        Optional<Author> authorOptional = getAuthor();
        if(authorOptional.isPresent()){
            System.out.println(authorOptional.get().getName());
            System.out.println(authorOptional.get().getAge());
        }
    }

Optional_数据_05

4.5 数据转换  43

Optional还提供了map可以让我们的对数据进行转换,并且转换得到的数据也还是被Optional包装好的,保证了我们的使用安全。

例如

我们想获取作家的书籍集合。

//map  我们想获取作家的书籍集合。  43
    private static void testMap() {
        Optional<Author> authorOptional = getAuthor();
        Optional<List<Book>> optionalBooks = authorOptional.map(author -> author.getBooks());
        optionalBooks.ifPresent(books -> System.out.println(books));
    }

Optional_数据_06

标签:Author,author,authorOptional,getAuthor,null,Optional
From: https://blog.51cto.com/u_15784725/6541185

相关文章

  • Optional 教程
    1、isPresent使用isPresent方法来判断非空,isPresent相当于!=nullisPresent返回一个booleanOptional<Student>optional=Optional.ofNullable(newStudent("王五",80));if(optional.isPresent()){//将输出:student1不为空的操作System.......
  • 消除if else & Optional 使用
    1、三目表达式获取对象的属性,判断对象是否为空,为空返回默认值Cc=newC("c");Stringname=c!=null?c.getName():DEFAULT_NAME;2、判断不为空再赋值Useruser=userDao.getUser(id);if(user!=null){user.setName("张三");}//使用OptionalOptional.ofN......
  • optional的正确使用
     loginResult.setTenant_id(Optional.ofNullable(user.getTenantCode()).orElse(""));loginResult.setTenant_name(Optional.ofNullable(user.getTenantName()).orElse("")); /***真实操作踢下线的逻辑**@paramparam*@paramisSt......
  • Java11 Optional
    简介publicfinalclassOptional<T>{privatestaticfinalOptional<?>EMPTY=newOptional<>();privatefinalTvalue;privateOptional(){this.value=null;}……}Optional<T>是个容器,在java.util包中用......
  • 学习笔记-Java8新特性-第五节-Optional类
    Optional类Optional<T>是一个容器类代表一个值存在或不存在致力于解决空指针异常问题(NPE)可以快速锁定发生NPE的位置(这东西真的好用吗?)常用方法Optional.of(Tt)创建一个Optional实例不能传入空指针,会报NPE使用Optional,报空指针了,说明就是这里的问题?......
  • Optional对象的使用
    Optional是一个对象容器,具有以下两个特点:提示用户要注意该对象有可能为null简化ifelse代码1.创建:Optional.empty():创建一个空的Optional实例//返回一个Null的optionalOptionalempty=Optional.empty();Optional.of(Tt):创建一个Optional......
  • Java8新特性6_Optional容器类
    Optional类概念Optional类是一个容器类,代表一个值存在或者不存在,原来null表示一个值不存在,现在Optional可以更好的表达这个概念,并且可以规避空指针异常常用方法Optional.of:创建一个Optional实例Optional.empty:创建一个空的Optional实例Optional.ofNullable:若t不为null......
  • java Optional使用
    1.Optional.of()或者Optional.ofNullable()创建Optional对象,差别在于of不允许参数是null,而ofNullable则无限制。1//参数不能是null2Optional<Integer>optional1=Optional.of(1);34//参数可以是null5Optional<Integer>optional2=Optional.ofNullable(null);2......
  • C++17:新特性之std::optional
    考虑一个问题,C++如何实现返回多个值?如何标记其中一个bool返回值用于记录函数运行状态?我们可以通过pair或tuple实现,有以下代码:#include<iostream>#include<string>usingnamespacestd;structss{ strings; intsize;};pair<bool,ss>func2(conststring&in){......
  • 使用Optional优雅避免空指针异常
    本文已收录至Github,推荐阅读......