Bibliothèque standard
Avec seulement la bibliothèque standard, utilisez ce que les autres réponses fournissent. C'est relativement court, clair, standard, tout le monde le comprendra. Elle vous oblige à gérer explicitement le cas où l'élément n'est pas présent, et c'est une bonne chose. Le seul élément "inutile" est le stream()
et cela a aussi sa raison d'être sémantique subtile.
Person john = personList.stream()
.filter(person -> person.getFirstName().equals("John"))
.findFirst()
.get();
Bibliothèques tierces
Si vous pouvez utiliser une bibliothèque, il existe des solutions plus courtes (mais pas nécessairement meilleures). L'utilisation de Google Guava's Iterables.find()
:
Person john = Iterables.find(personList, person -> person.getFirstName().equals("John"));
(Il est à noter qu'une exception est levée si l'élément n'est pas trouvé. Envisagez d'utiliser l'autre méthode find()
avec une valeur par défaut, ou la méthode tryFind()
méthode.)
La même chose est disponible dans de nombreuses autres bibliothèques, par exemple Collections Apache Commons : IterableUtils.find()
.
La goyave mentionnée ci-dessus possède également les caractéristiques suivantes onlyElement()
collecteur :
Person john = personList.stream()
.filter(person -> person.getFirstName().equals("John"))
.collect(MoreCollectors.onlyElement());
Une approche différente
La recherche d'un élément spécifique dans une liste est une opération linéaire, ou O(n). Si vous devez effectuer cette opération de manière répétée, il est clair que vous devez utiliser une structure de données différente. Peut-être qu'une table de correspondance entre les noms de personnes et les personnes serait plus utile ?
Map<String, Person> personsByFirstName = personList.stream()
.collect(toMap(Person::getFirstName, Function.identity()));
Person john = personsByFirstName.get("John");
(Notez que cela ne permet de conserver qu'une seule personne par prénom. Ce n'est probablement pas ce que vous voulez, n'est-ce pas ?)