学习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();

我有一个现有的代码,我希望转换成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()));
有没有更优化的方法来实现这一点


谢谢你的帮助

我可能会这么写

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)