在之前的一篇文章中介绍了 Java 中的 Lambda 表达式。在本文中,我将介绍如何结合 Lambda 表达式和 Optional,让 Java 更优雅地处理 null 值。
假设我们有一个学生对象,以及这个学生对象的 Optional 包装器:
public class Student {
private String name;
private Integer age;
// 全参构造函数
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
// toString 方法
@Override
public String toString() {
return"Student{" + "name='" + name + '\'' + ", age=" + age + '}';
}
}
public class OptionalTest {
public static void main(String[] args) {
Student student = new Student("Bob", 18);
Optional<Student> studentOpt = Optional.ofNullable(student);
}
}
如果不与 Lambda 结合使用,Optional 并不能简化原本繁琐的 null 值检查。例如:
// 编写方法 1
if (student == null) {
return UNKNOWN_STUDENT;
} else {
return student;
}
// 编写方法 2
if (!studentOpt.isPresent()) {
return UNKNOWN_STUDENT;
} else {
return studentOpt.get();
}
只有将 Optional 与 Lambda 结合使用,才能发挥它真正的威力!
现在,让我们对比一下 Java 8 中 Lambda + Optional 与传统 Java 在以下四种常见 null 处理场景中的差异。
场景 1:不为 null 则执行
// if 语句
if (student!= null) {
System.out.println(student);
}
// Optional
studentOpt.ifPresent(System.out::println);
场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常
// if 语句
if (student == null) {
return UNKNOWN_STUDENT; // 或抛出异常
} else {
return student;
}
// Optional
return studentOpt.orElse(UNKNOWN_STUDENT);
return studentOpt.orElseThrow(RuntimeException::new);
场景 3:不为 null 则返回,为 null 则由调用方法
// if 语句
if (student == null) {
return UNKNOWN_STUDENT;
} else {
return generateWithFunction();
}
// Optional
return studentOpt.orElseGet(() -> generateWithFunction());
场景 4:嵌套 null 检查
// Java 7
if (student!= null) {
String name = student.getName();
if (name!= null) {
return name;
} else {
return null;
}
} else {
return null;
}
// Java 8
return studentOpt.map(Student::getName).orElse(null);
从以上四种场景可以明显看出,Optional + Lambda 让我们少写了很多 if-else 代码块。尤其是场景 4,传统的 Java 写法显得冗长且难以理解,而 Optional+Lambda 则简洁明了,清晰易懂。
总结
通过结合 Lambda 表达式和 Optional,Java 的 null 处理变得更加优雅和简洁。希望这篇文章能帮助你更好地理解和使用这些特性。