专业的编程技术博客社区

网站首页 > 博客文章 正文

Java Lambda从入门到精通之二十二Optional类

baijin 2024-11-03 12:29:30 博客文章 17 ℃ 0 评论

我们为什么要在Lambda的课程里讲一个看似和Lambda不相关的Optional内容呢?

因为Lambda中流的操作有很多方法会将返回的类型定义到Optional中,这样定义对Lambda中流的中间操作方法,有非常重要的意义,所以了解清楚Optional的特性是非常有必要的。

Optional的概念

Java 8中引入了一个新的类java.util.Optional<T> ,Optional类是一个容器类,代表一个值存在或不存在,这一个特性就可以帮助我们解决Java程序员最常见的NullPointerException

怎样产生的空指针异常

我们有一个Person类,Person中又定义了一个Address类,代码:

@Data
public class Person {
    private String name;
    private int age;
    private Address address;
}

@Data
public class Address {
    private String addressInfo;
}

如果我们执行下面的代码:

public class OptionalClient {

    public static void main(String[] args) {
        Person person = new Person();
        person.getAddress().getAddressInfo();
    }
}

则会得到空指针异常:

Exception in thread "main" java.lang.NullPointerException
	at com.itzhimei.study.lambda.OptionalClient.main(OptionalClient.java:11)

空指针异常就是应用了未定义的对象中的属性,则会产生空指针异常。


怎样使用Optional消除空指针异常

不使用Optional,我们之前的做法就是使用if来判断person是否为空,address是否为空,不为空则调用address的属性。

我们先对Person中的Address进行一点小修改:

@Data
public class Person2 {
    private String name;
    private int age;
    private Optional<Address> address;
}

我们将Address用Optional封装起来,此时Person的Address就变成了一个Optional容器。

测试类代码:

public class OptionalClient2 {

    public static void main(String[] args) {
        Person2 person2 = new Person2();
        person2.setAddress(Optional.empty());
        Optional<Address> address = person2.getAddress();
        boolean present = address.isPresent();
        Address address1 = address.orElse(new Address());
        Address address2 = address.get();
    }
}

我们使用Person的对象获取Address,返回类型已经变成了Optional<Address>,这个返回类型是一个容器,通过调用isPresent()方法,判断Optional中的值(Address)如果非空,返回true,否则返回false。

orElse()方法其实相当于一个三目运算符:

address !=null ? address:new Addrsss()

get()方法就是提取Optional<Address>中的Address对象,如果为空,也会产生java.util.NoSuchElementException异常,所以我们上面说的是合理使用Optional会避免空指针异常。


Optional对于Lambda的意义

Optional是一个容器,它可以解决最常见的空指针问题,应用到流上,可以有效解决流(Stream)经过各种运算、筛选等操作后,计算结果为空而报错的情况,如果没有Optional,还是像Java8之前的代码书写方法,如果我们直接使用流的各种方法不停地运算,一旦中间一个环节计算结果为空,那么后续操作的数据就是用null来计算,必然会报空指针了,如果不想抛出NullPointerException,那么每一步操作都需要对前一步带过来的值进行if(xx!=null)这样类似的判断。就如我们上面的例子,如果Person中的Address对象为空,直接这样调用

        person.getAddress().getAddressInfo();

肯定会报空指针的。所以Lambda 流的中间操作方法,都会返回Optional类型封装的结果,来保证一旦中间某个方法操作结果为null,为了避免抛出异常,可以不写大段if判断,而是通过Optional提供的方法优雅的处理这种情况,这就是Optional对与Lambda流的意义所在。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表