假设我们有一个学生对象,以及这个学生对象的 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 处理变得更加优雅和简洁。希望这篇文章能帮助你更好地理解和使用这些特性。
到此这篇关于浅析java中如何优雅地处理null值的文章就介绍到这了,更多相关java处理null值内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论