内の要素を検索します。私はリストを反復し、特定のIDを持つインスタンスを見つけたいと思います。私はストリームを介してそれをやろうとしています。Javaの8ストリームは、私は以下のクラスを持っているリスト
public void foobar() {
List<Item> items = getItemList();
List<Integer> ids = getIdsToLookup();
int id, i = ids.size() - 1;
while (i >= 0) {
id = ids.get(i);
Optional<Item> item = items
.stream()
.filter(a -> a.getId() == id)
.findFirst();
// do stuff
i--;
}
}
これはリストを反復処理して必要な要素を取得する最も良い方法ですか?また、lambda式で使用されている変数がfinalまたは実質的にfinalでなければならないというidのフィルタ行にエラーが発生します。おそらく、私はwhileループ内でidを定義することができ、例外を取り除くべきです。ありがとう。ここ
ids.forEach(id ->
list.stream()
.filter(p -> p.getId() == id)
.findFirst()
.ifPresent(p -> {//do stuff here});
);
オプションあなたがFindFirstのを呼び出すので、もし、あなたのフィルタ方法は、それが1つのまたはゼロの要素を見つけることができ、空のストリームを返すことができることを示しています
リストのインデックスとラムダの現在のアイテムに同じ変数iを使用しています。別の名前を選択してください。そのコードは問題ありませんが、非常に非効率です。複数のidsがあり、すべてのアイテムを見つける必要がある場合は、まずHashMapを作成してから、HashMapを使用します。 –
私はコード内で別の変数を使用していますが、私はここでコードを単純化しようとしていました。私はそれを変更します。 –
ループ内で変数 'id' **を宣言すると、それは実質的に最終的になります。外に出ることで、各反復でそれを再初期化します。したがって、最終的なものではありません。可能な限り小さな範囲で変数を宣言することが一般的にベストプラクティスです。 –