Java 我们可以提取流中的主要对象吗

Java 我们可以提取流中的主要对象吗,java,java-8,java-stream,Java,Java 8,Java Stream,我有一个footballsteam类,包含Footballer类。如果footballsteam包含具有特定id的footballsteam,则可以使用流从足球队列表中获取footballsteam。是否可以使用流执行以下操作。i、 e同时获得目标球员和目标球员 FootballTeam targetTeam = null; Footballer targetFootballer = null; for(FootballTeam team : list.getFootballTeams()){

我有一个
footballsteam
类,包含
Footballer
类。如果
footballsteam
包含具有特定
id
footballsteam
,则可以使用流从足球队列表中获取
footballsteam
。是否可以使用流执行以下操作。i、 e同时获得目标球员和目标球员

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;
    }
}

不要从循环的角度考虑,而是要考虑您正在执行的高级操作,例如,查找与条件匹配的第一个元素。表达这种操作的最大障碍是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);
Map.Entry target=list.getFootballTeams()
.stream()
.flatMap(团队->团队.getFootballers()
.stream()
.filter(f->f.getId()==1)
.map(f->newAbstractMap.SimpleImmutableEntry(team,f)))
.findFirst()
.orElse(空);
由于您可能希望对这些值执行后续操作,因此可以避免将结果存储在变量中,并直接应用该操作,例如

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
    });
list.getfootballsteams()
.stream()
.flatMap(团队->团队.getFootballers()
.stream()
.filter(f->f.getId()==1)
.map(f->newAbstractMap.SimpleImmutableEntry(team,f)))
.findFirst()
.如果存在(e->{
足球队targettam=e.getKey();
足球运动员目标足球运动员=e.getValue();
//行动起来
});

在这里,仅当找到匹配项并且不需要显式代码处理缺少的值时,才会执行该操作。在第一个示例中,
.orElse(null)
表示如果没有找到匹配项,
目标
应该是
null
,因此您以后必须测试
null

当条件
if(f.getId()==1)时,您是否希望检索第一个
足球队
足球运动员
满足还是最后一个?不可能,因为不能在lambdas中使用非最终变量(targetFootballer)。如果是最终变量,该怎么办。是的,这个条件就是id@user3310115我的问题是,您是否希望在满足条件后立即停止迭代,然后检索
足球队
足球运动员
?我认为您在
如果
条件中缺少第二个
中断
,对吗?