ラムダ式の可能性を探るために、いくつかの for-each ループを lambda メソッドに変更しようとしていますforEach()
。次のことが可能なようです:
ArrayList<Player> playersOfTeam = new ArrayList<Player>();
for (Player player : players) {
if (player.getTeam().equals(teamName)) {
playersOfTeam.add(player);
}
}
ラムダ付きforEach()
players.forEach(player->{if (player.getTeam().equals(teamName)) {playersOfTeam.add(player);}});
しかし、次のものは機能しません。
for (Player player : players) {
if (player.getName().contains(name)) {
return player;
}
}
ラムダ付き
players.forEach(player->{if (player.getName().contains(name)) {return player;}});
最後の行の構文に何か間違いがあるのでしょうか、それともforEach()
メソッドから戻ることができないのでしょうか?
ベストアンサー1
return
包含メソッドからではなく、ラムダ式から返されます。代わりに、ストリームをforEach
使用する必要があります。filter
players.stream().filter(player -> player.getName().contains(name))
.findFirst().orElse(null);
ここでは、filter
述語に一致する項目にストリームを制限し、最初に一致するエントリを含むfindFirst
を返します。Optional
これはforループアプローチよりも効率が悪いように見えますが、実際にはfindFirst()
短絡することができます。フィルタリングされたストリーム全体を生成してそこから1つの要素を抽出するのではなく、最初に一致するものを見つけるために必要な数の要素のみをフィルタリングします。必ずしも一致するものを取得する必要がない場合は、findAny()
の代わりにを使用することもできます。findFirst()
初め(順序付けられた)ストリームから一致するプレーヤーではなく、単に一致するアイテムを取得します。これにより、並列処理が関係する場合に効率が向上します。