我们可以在流中提取主要对象

use*_*115 4 java java-8 java-stream

我有一个FootballTeam包含Footballer类的类.使用流可以FootballTeam从足球队列表中获取,如果FootballTeam包含Footballer特定的id.是否可以使用流进行以下操作.即获得targetFootballertargetTeam;

FootballTeam targetTeam = null;
Footballer targetFootballer = null;

for(FootballTeam team : list.getFootballTeams()){
    for(Footballer f : team.getFootballers()) {
        if(f.getId() == 1){
           targetFootballer = f;
           break;
        }
    }
    if(targetFootballer != null) {
        targetTeam = team;
    }
}
Run Code Online (Sandbox Code Playgroud)

Hol*_*ger 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);
Run Code Online (Sandbox Code Playgroud)

由于您可能希望对这些值执行后续操作,因此可以避免将结果存储在变量中并直接应用操作,例如

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

这里,只有在找到匹配项并且您不需要显式代码处理缺席值时才会执行操作.在第一个例子,.orElse(null)说的target应该是null,如果没有发现匹配,所以你必须测试null后,上.