Java 8 流 - 过滤多个条件

2022-09-03 00:10:06

基于一些运动结果数据,我有一个对象和方法。我想缩短我编写的此方法,使其仅使用单个lambda函数(而不是创建一个新列表和两个lambda),这可能吗?FixturegetHome()getAway()

    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;
}

答案 1

非常简单

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

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


答案 2

如果你想花哨的lambdas:

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)); 
...

推荐