我试图将一些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()。这允许在涉及并行性时提高效率