我有一个现有代码,我希望转换为Java8提供的流:
for(Person details: modList){
if (null != details &&null!=details.getPersonChild()) {
Child mod= details.getPersonChild();
if (mod.isAB() ||
mod.isBC() ||
mod.isCD() ||
mod.idDE() ||
mod.isEF()) {
childeligible = true;
break;
}
}
}
到目前为止我已经完成了:
return details.stream()
.filter( p -> null != p && null != p.getPersonChild())
.map(Person::getPersonChild)
.anyMatch(mi -> (mod.isAB() || mod.isBC() || mod.isCD() || mod.idDE() || mod.isEF()));
是否有更优化的方法来实现这一目标
感谢您的帮助
答案 0 :(得分:4)
我写作的方式是
return Details.stream()
.filter(p -> null != p)
.map(Person::getPersonChild)
.filter(pc -> null != pc)
.anyMatch(pc -> pc.isABCEDF());
isABCDEF
检查所有条件的地方。
不能添加该方法
或者您可以添加此方法,更好地描述它正在检查的内容。
.anyMatch(pc -> isABCEDF(pc));
如果您不想添加方法,则可以按照建议进行操作
.anyMatch(c -> c.isAB() || c.isBC() || c.isCD() || c.idDE() || c.isEF());
正如@WanderNauta所指出的那样,如果您觉得这一点更清楚,您也可以使用.filter(Objects::nonNull)
进行空检查。
答案 1 :(得分:3)
其他解决方案是:
Details.stream()
.filter(Objects::nonNull)
.map(Person::getPersonChild)
.filter(Objects::nonNull)
.anyMatch(
((Predicate<String>) Child::isAB).
or(Child::isBC).
or(Child::isDE).
or(Child::isEF)
);
我们正在使用Predicates
方法合并一些Predicate.or
:
((Predicate<String>) Child::isAB).or(Child::isBC).or(Child::isDE).or(Child::isEF)