网站首页 > 博客文章 正文
我们为什么要在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流的意义所在。
猜你喜欢
- 2024-11-03 java8,你应该了解的新特性(空指针终结者:Optional 类)
- 2024-11-03 Java Optional使用指南(java.util.optional)
- 2024-11-03 Java 8 Optional 最佳指南(java中optional)
- 2024-11-03 「Java8实战」使用Optional取代null
- 2024-11-03 Java Optional类的使用(java options类)
- 2024-11-03 Java8新特性:Optional 类(java options类)
- 2024-11-03 惊了,JDK都到23了,据说还有99%Java程序员都不会用optional?
- 2024-11-03 还在用if(obj!=null)做非空判断?带你快速上手Optional实战
- 2024-11-03 JDK8中新增的Optional工具类真的很好用哦,建议收藏
- 2024-11-03 Java8新特性之空指针异常的克星Optional类
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)