ich die folgende Klasse haben:Java 8 Stream-Element in der Liste finden
public class Item {
int id;
String name;
// few other fields, contructor, getters and setters
}
Ich habe eine Liste von Elementen. Ich möchte die Liste durchlaufen und die Instanz finden, die eine bestimmte ID hat. Ich versuche es durch Streams zu machen.
Ist dies der beste Weg, um über die Liste zu iterieren und das Element zu bekommen, das ich brauche? Außerdem erhalte ich einen Fehler in der Filterzeile für ID, der besagt, dass Variablen, die in Lambda-Ausdrücken verwendet werden, final oder effektiv final sein müssen. Vielleicht kann ich ID innerhalb der While-Schleife definieren, das sollte die Ausnahme loswerden. Vielen Dank.
ids.forEach(id ->
list.stream()
.filter(p -> p.getId() == id)
.findFirst()
.ifPresent(p -> {//do stuff here});
);
Optional hier zeigt, dass Ihre Filtermethode einen leeren Stream zurückkehren können, wenn Sie also findfirst nennen kann es ein oder Null-Elemente finden:
Sie verwenden die gleiche Variable i für den Index in der Liste und für das aktuelle Element im Lambda. Wählen Sie einen anderen Namen. Dieser Code ist in Ordnung, aber ziemlich ineffizient. Wenn Sie mehrere IDs haben und das entsprechende Element für alle suchen müssen, erstellen Sie zuerst eine HashMap und verwenden Sie dann die HashMap. –
Ich verwende eine andere Variable in meinem Code, ich habe versucht, den Code hier zu vereinfachen. Ich werde es ändern. –
Deklarieren Sie die Variable "ID" ** innerhalb der Schleife, und es wird effektiv endgültig. Wenn du draußen bist, initialisierst du es bei jeder Wiederholung neu und es ist somit nicht endgültig. Das Deklarieren von Variablen im kleinstmöglichen Umfang ist im Allgemeinen eine bewährte Methode. –