使用JAVA 8 Streams转换

时间:2016-11-25 11:20:58

标签: java java-8 java-stream

我尝试将此代码更改为Java 8流。我的代码如下所示:

for(D d : n.getD()) {
    for(M m : d.getT().getM()) {
        if(m.getAC().contains(this)) {
            return d;
        }
    }
}

我希望将其转换为java 8流。我是这样开始的:

  n.getD().stream()
        .map(m -> m.getT().getM())

但我不知道我是否应映射,或使用过滤器

3 个答案:

答案 0 :(得分:4)

其他可能的方法是使用anyMatch代替第二filter

return n.getD().stream().filter(
   d -> d.getT().getM().stream().anyMatch(
         m -> m.getAC().contains(this)
   )
).findFirst(); // result will be Optional<D>

答案 1 :(得分:2)

处理此问题的一种方法:

return n.getD().stream().filter(d -> d.getT().getM().stream().filter(m -> m.getAC().contains(this)).findFirst().isPresent()).findFirst();

在这种情况下,可以使用空值。

答案 2 :(得分:1)

我不了解您的域名,但为了保持其可读性,我可能会委托并简化为以下内容:

return n.getD().stream()
               .filter(d -> d.getT().containsAC(this))
               .findFirst()
               .orElse(null);

然后在T类添加委托方法:

public boolean containsAC(AC ac) {
    return m.stream().anyMatch(m -> m.getAC().contains(ac));
}