Java 8 Streams - 过滤多个条件

时间:2018-03-19 16:51:13

标签: 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;
}

4 个答案:

答案 0 :(得分:5)

足够简单

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

编辑:这是假设订单对您无关紧要。如果您的最终列表需要有主页结果然后离开,请查看Elliott Frisch's answer

答案 1 :(得分:4)

如果你想看上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()));

答案 2 :(得分:3)

假设订单无关紧要,您可以在一行上完成。像,

private Collection<FixtureResult> finalResults(Team team) {
    return resultList.stream()
            .filter(fixture -> fixture.getHome().equals(team) 
                    || fixture.getAway().equals(team))
            .collect(toList());
}

如果订单很重要(主页结果然后离开),您可以使用单个List来完成

private Collection<FixtureResult> finalResults(Team team) {
    List<FixtureResult> al = new ArrayList<>(resultList.stream()
            .filter(fixture -> fixture.getHome().equals(team)).collect(toList()));
    al.addAll(resultList.stream()
            .filter(fixture -> fixture.getAway().equals(team)).collect(toList()));
    return al;
}

答案 3 :(得分:1)

您可以简单地创建条件连接,也可以连接多个过滤器调用

条件连接

get_dummies

多次过滤电话

columns