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());
}
}
}











网友评论