平时我们很多实体类里面会嵌套实体类,实体里面还嵌套实体。
那么我们有时为了取出最里面的实体的某个值的时候,我们就不得不一层层剥开这个 让人流泪的洋葱, 一层层判断。
举例(随便举的):
就像这么一个实体类,
学校信息统计类 SchoolSumInfo ,里面包含 教师信息统计类 TeacherSumInfo 和 学生信息统计类 StudentSumInfo。
而教师信息统计类 TeacherSumInfo , 里面包含了 优秀教师信息统计类 ProminentTeacherSumInfo。
而优秀教师信息统计类ProminentTeacherSumInfo ,里面包含了评选出来的一位 最佳教师 String mostManName, 还有全部优秀教师的姓名集合 List<String> names、总数 Integer count等。
那么来一个业务场景, 我们现在已经查询得到了 某个小学的 学校信息统计类,
我需要知道这里面的 最佳教师是谁?
如果没有,就如实说 ‘暂无’。
按照平常我们多半都是会去剥洋葱,写if 判空:
SchoolSumInfo schoolSumInfo = getNullValueSchoolSumInfo(); String mostManName = "暂无"; if (Objects.nonNull(schoolSumInfo)) { TeacherSumInfo teacherSumInfo = schoolSumInfo.getTeacherSumInfo(); if (Objects.nonNull(teacherSumInfo)) { ProminentTeacherSumInfo prominentTeacherSumInfo = teacherSumInfo.getProminentTeacherSumInfo(); if (Objects.nonNull(prominentTeacherSumInfo)) { if (StringUtils.isEmpty(prominentTeacherSumInfo.getMostManName())){ mostManName=prominentTeacherSumInfo.getMostManName(); } } } } System.out.println(" 获取结果: " + mostManName);
看那一层一层的if null 判断 :
那么如果我们用 Optional (Java 8 引入 ,主要是为了解决空指针异常NullPointerException)怎么把上面提到的业务场景判空取值代码给优雅呢?
来,首先我们写两个小函数,模拟一个是有值的,一个是没值的。
然后再看Optional玩法 :
噢,我的上帝,多么优雅的代码啊。
SchoolSumInfo schoolSumInfo = getNullValueSchoolSumInfo();
String prominentTeaCount = Optional.of(schoolSumInfo)
.map(SchoolSumInfo::getTeacherSumInfo)
.map(TeacherSumInfo::getProminentTeacherSumInfo)
.map(ProminentTeacherSumInfo::getMostManName)
.orElse("暂无");
System.out.println("getNullValueSchoolSumInfo 获取结果: " + prominentTeaCount);
SchoolSumInfo schoolSumInfo1 = getHasValueSchoolSumInfo();
String prominentTeaCount1 = Optional.of(schoolSumInfo1)
.map(SchoolSumInfo::getTeacherSumInfo)
.map(TeacherSumInfo::getProminentTeacherSumInfo)
.map(ProminentTeacherSumInfo::getMostManName)
.orElse("暂无");
System.out.println("getHasValueSchoolSumInfo 获取结果:" + prominentTeaCount1);
看下返回结果,没值的填充了默认值 ‘ 暂无’ ,有值的返回了最佳教师 “JCccc” ,非常对: