根据一些体育赛事结果数据,我有一个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;
}
答案 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