ho la seguente classe:Java 8 Stream per trovare elemento della lista
public class Item {
int id;
String name;
// few other fields, contructor, getters and setters
}
Ho una lista di elementi. Voglio scorrere l'elenco e trovare l'istanza che ha un ID particolare. Sto provando a farlo attraverso i flussi.
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--;
}
}
È questo il modo migliore per iterare la lista e ottenere l'elemento di cui ho bisogno? Inoltre, ottengo un errore sulla riga del filtro per id che dice che le variabili usate nelle espressioni lambda devono essere definitive o effettivamente definitive. Forse posso definire id all'interno del ciclo while, che dovrebbe sbarazzarsi dell'eccezione. Grazie.
Si sta utilizzando la stessa variabile i per l'indice nell'elenco e per l'elemento corrente in lambda. Scegli un nome diverso. Quel codice va bene, ma piuttosto inefficiente. Se hai più ID e hai bisogno di trovare l'elemento corrispondente per tutti, inizia creando un HashMap, e poi usa HashMap. –
Sto usando una variabile diversa nel mio codice, stavo cercando di semplificare il codice qui. Lo cambierò. –
Dichiara la variabile 'id' ** all'interno ** del ciclo, e sarà effettivamente definitiva. Essendo all'esterno, lo si reinizializza ad ogni iterazione e non è quindi definitivo. Dichiarare le variabili nel più piccolo ambito possibile è una best practice in generale. –