学习Java8流
我有一个现有的代码,我希望转换成Java8提供的流:学习Java8流,java,collections,java-8,java-stream,Java,Collections,Java 8,Java Stream,我有一个现有的代码,我希望转换成Java8提供的流: for(Person details: modList){ if (null != details &&null!=details.getPersonChild()) { Child mod= details.getPersonChild();
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()));
有没有更优化的方法来实现这一点
谢谢你的帮助我可能会这么写
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)
进行空检查。其他解决方案是:
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)
);
您可以添加一个
isABCDEF()
方法吗?这是一个小小的改进,但是一旦您的流中有了子对象,您就可以使用.filter(Objects::nonNull)
来筛选非null的对象。不,不能添加该方法…因为子类不在范围内,您可以使用anyMatch(Child::isBC.或(Child::isCD).或(Child::isDE))
但我不确定这是否更清楚。@KlitosKyriacou,我们需要转换到谓词
,否则它不会编译((谓词)Child::isAB)。或者(…)
,或者你将最后一个过滤器
与任何匹配
:详细信息.stream().filter(Objects::nonNull)。map(Person::getPersonChild)。任何匹配融合在一起(pc->null!=pc&&pc.isABCEDF())
modList.stream().filter(details->null!=details&&null!=details.getPersonChild()).map(Person::getPersonChild).anyMatch((Child::isAB | Child::isBC | Child::isCD | Child.isDE | Child::isEF))-->>当我写Child::isAB | | |时,我得到一个错误…它说它应该是一个函数接口Exact error是这个表达式的目标类型必须是函数接口,并且在任何匹配项下都有红线((Child::isAB | | Child::isCD | Child.isDE | Child::isEF));另外,它不允许我使用objects::nonNull。错误是方法筛选器(Predicate@Hali你不能以这种方式对谓词使用| |,你必须按照klitos kyriacou建议的方式使用它,但我认为这很难看。你的另一个错误是由于代码没有编译,并且变得混乱。也就是说,只有一个错误。
((Predicate<String>) Child::isAB).or(Child::isBC).or(Child::isDE).or(Child::isEF)