从java中的lambda forEach()返回

我试图将一些for each循环更改为lambdaforEach()——方法,以发现lambda表达式的可能性。以下似乎是可能的:

ArrayList<播放器>playersOfTeam=新阵列列表<播放器>();      
用于(玩家:玩家){
if(player.getTeam().equals(teamName)){
playersOfTeam.add(player);
}
}

使用lambdaforEach()

players.forEach(player->{if(player.getTeam().equals(teamName)){playersOfTeam.add(player);});

但下一个不起作用:

用于(玩家:玩家){
if(player.getName().contains(name)){
返回球员;
}
}

和lambda

players.forEach(player->{if(player.getName().contains(name)){return player;}});

最后一行的语法是否有错误,或者无法从forEach()方法返回

return从lambda表达式返回,而不是从包含方法返回。您需要过滤流,而不是forEach

player.stream().filter(player->player.getName().contains(name))
.findFirst().orElse(null);

此处filter将流限制为与谓词匹配的项,然后findFirst返回带有第一个匹配项的可选项

这看起来比for循环方法效率低,但实际上findFirst()可能会短路-它不会生成整个过滤流,然后从中提取一个元素,而是只过滤所需数量的元素,以便找到第一个匹配的元素。如果您不一定关心从(有序的)流中获取第一个匹配的播放器,而只关心任何匹配的项目,那么也可以使用findAny()而不是findFirst()。这允许在涉及并行性时提高效率

发表评论