我有一个现有的代码,我希望转换成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()));有没有更优化的方法来实现这一点?
谢谢你的帮助
发布于 2017-02-03 20:56:59
我可能写的方式是
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)进行null检查。
发布于 2017-02-03 21:58:46
其他解决方案是:
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)
);我们在这里使用Predicate.or方法组合了几个Predicates:
((Predicate<String>) Child::isAB).or(Child::isBC).or(Child::isDE).or(Child::isEF) https://stackoverflow.com/questions/42024782
复制相似问题