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)
很简单
resultList.stream()
.filter(fixture -> fixture.getHome().equals(team) || fixture.getAway().equals(team)))
.collect(toList());
Run Code Online (Sandbox Code Playgroud)
编辑:这是假设订单对您无关紧要.如果你的最终名单需要有主场成绩然后离开,请看看Elliott Frisch的回答.
如果您想看上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)
| 归档时间: |
|
| 查看次数: |
4596 次 |
| 最近记录: |