假设我们有一个学生对象,以及这个学生对象的 Optional 包装器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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 + '}'; } } |
1 2 3 4 5 6 |
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 2 3 4 5 6 7 8 9 10 11 12 |
// 编写方法 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 2 3 4 5 6 |
// if 语句 if (student!= null) { System.out.println(student); } // Optional studentOpt.ifPresent(System.out::println); |
1 2 3 4 5 6 7 8 9 |
// if 语句 if (student == null) { return UNKNOWN_STUDENT; // 或抛出异常 } else { return student; } // Optional return studentOpt.orElse(UNKNOWN_STUDENT); return studentOpt.orElseThrow(RuntimeException::new); |
1 2 3 4 5 6 7 8 |
// if 语句 if (student == null) { return UNKNOWN_STUDENT; } else { return generateWithFunction(); } // Optional return studentOpt.orElseGet(() -> generateWithFunction()); |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 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 处理变得更加优雅和简洁。希望这篇文章能帮助你更好地理解和使用这些特性。