Java 8 Flux de rechercher un élément dans la liste

J'ai la classe suivante:

public class Item {
    int id;
    String name;
    //few other fields, contructor, getters and setters
}

J'ai une liste d'Éléments. Je veux parcourir la liste pour trouver l'exemple qui a un id particulier. Je suis en train de le faire dans les ruisseaux.

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--;
    }
}

Est-ce la meilleure façon d'itérer sur la liste et obtenir l'élément que j'ai besoin? Aussi, j'obtiens une erreur sur le filtre de ligne pour l'id qui dit que les variables utilisées dans les expressions lambda doit être définitive ou efficacement final. Peut-être que je peux définir l'id à l'intérieur de la boucle while, qui devrait se débarrasser de l'exception. Merci.

Vous utilisez la même variable i pour l'index dans la liste, et pour l'élément courant dans le lambda. Choisir un nom différent. Ce code est bien, mais tout à fait inefficace. Si vous avez de multiples identifiants et ont besoin de trouver l'élément correspondant pour tous, à commencer par la création d'une HashMap<Integer, Item>, et ensuite utiliser la table de hachage.
Je suis en utilisant une autre variable dans mon code, j'ai essayé de simplifier le code ici. Je vais le changer.
Déclarer la variable id à l'intérieur la boucle, et il sera effectivement final. En étant à l'extérieur, vous réinitialiser à chaque itération, et c'est donc pas définitive. Déclarer des variables dans la portée plus petite possible est une meilleure pratique en général.
Ouais, c'est ce que je pensais. Merci pour la suggestion.
De même pour la boucle BTW, utilisez for (int i = 0; i < ids.size(); i++), ou encore mieux et plus simple: for (Integer id : ids)

OriginalL'auteur Gengis Khan | 2016-03-10