我有一个包含FootballTeam
类的Footballer
类。如果FootballTeam
包含具有特定FootballTeam
的{{1}},则可以使用流从足球队列表中获取Footballer
。是否可以使用流进行以下操作。即同时获取id
和targetFootballer
;
targetTeam
答案 0 :(得分:7)
不要考虑循环,而是考虑您正在执行的高级操作,例如:找到符合条件的第一个元素。表达此类操作的最大障碍是Java方法无法返回两个值。使用Map.Entry
作为保存两个结果的对类型,您可以使用
Map.Entry<FootballTeam,Footballer> target = list.getFootballTeams()
.stream()
.flatMap(team -> team.getFootballers()
.stream()
.filter(f -> f.getId() == 1)
.map(f -> new AbstractMap.SimpleImmutableEntry<>(team, f)))
.findFirst()
.orElse(null);
由于您可能希望对这些值执行后续操作,因此可以避免将结果存储在变量中并直接应用操作,例如
list.getFootballTeams()
.stream()
.flatMap(team -> team.getFootballers()
.stream()
.filter(f -> f.getId() == 1)
.map(f -> new AbstractMap.SimpleImmutableEntry<>(team, f)))
.findFirst()
.ifPresent(e -> {
FootballTeam targetTeam = e.getKey();
Footballer targetFootballer = e.getValue();
// do your action
});
此处,只有在找到匹配项且您不需要显式代码处理缺席值时才会执行操作。在第一个示例中,.orElse(null)
表示如果未找到匹配项,则target
应为null
,因此您必须稍后测试null
。