Java 8 Streams - 过滤多个条件

新手上路,请多包涵

根据一些运动成绩数据,我有一个 Fixture 对象,它有 getHome()getAway() 方法。我想缩短我编写的这个方法,只使用一个 lambda 函数(而不是创建一个新列表和两个 lambda),这可能吗?

     private Collection<FixtureResult> finalResults(Team team) {

    List<FixtureResult>finalResults = new ArrayList<>();

    List<FixtureResult> homeResults = resultList.stream().filter(fixture ->
            fixture.getHome().equals(team))
            .collect(toList());

    List<FixtureResult> awayResults = resultList.stream().filter(fixture ->
            fixture.getAway().equals(team))
            .collect(toList());

    finalResults.addAll(homeResults);
    finalResults.addAll(awayResults);

    return finalResults;
}

原文由 Clatty Cake 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

足够简单

resultList.stream()
        .filter(fixture -> fixture.getHome().equals(team) || fixture.getAway().equals(team)))
        .collect(toList());

编辑: 这是基于订单对您无关紧要的假设。如果您的最终列表需要主场结果然后离开,请查看 Elliott Frisch 的回答

原文由 user7 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果你想对 lambda 感兴趣:

 Predicate<FixtureResult> isHome = fr -> fr.getHome().equals(team)
Predicate<FixtureResult> isAway = fr -> fr.getAway().equals(team)

resultList.stream()
  .filter(isHome.or(isAway))
  .collect(toList()));

您甚至可以提取组合谓词以隔离测试它,不涉及任何流,这对于更复杂的谓词很有用:

 Predicate<FixtureResult> isHomeOrAway = isHome.or(isAway)

assertTrue(isHomeOrAway(homeFixture));
...

原文由 Chirlo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题