Java 8 Streams - 过滤多个条件

Cla*_*ake 5 java lambda java-8 java-stream

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

    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;
}
Run Code Online (Sandbox Code Playgroud)

use*_*er7 7

很简单

resultList.stream()
        .filter(fixture -> fixture.getHome().equals(team) || fixture.getAway().equals(team)))
        .collect(toList());
Run Code Online (Sandbox Code Playgroud)

编辑:这是假设订单对您无关紧要.如果你的最终名单需要有主场成绩然后离开,请看看Elliott Frisch的回答.


Chi*_*rlo 6

如果您想看上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()));
Run Code Online (Sandbox Code Playgroud)

您甚至可以提取compose谓词以进行隔离测试,而无需涉及流,这对于更复杂的谓词是有好处的:

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

assertTrue(isHomeOrAway(homeFixture)); 
...
Run Code Online (Sandbox Code Playgroud)