J'essaie d'utiliser Java 8 Stream
pour trouver des éléments dans a LinkedList
. Je veux cependant garantir qu'il y a une et une seule correspondance avec les critères de filtrage.
Prenez ce code:
public static void main(String[] args) {
LinkedList<User> users = new LinkedList<>();
users.add(new User(1, "User1"));
users.add(new User(2, "User2"));
users.add(new User(3, "User3"));
User match = users.stream().filter((user) -> user.getId() == 1).findAny().get();
System.out.println(match.toString());
}
static class User {
@Override
public String toString() {
return id + " - " + username;
}
int id;
String username;
public User() {
}
public User(int id, String username) {
this.id = id;
this.username = username;
}
public void setUsername(String username) {
this.username = username;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public int getId() {
return id;
}
}
Ce code trouve un User
basé sur leur ID. Mais rien ne garantit le nombre de User
s correspondant au filtre.
Changer la ligne de filtre en:
User match = users.stream().filter((user) -> user.getId() < 0).findAny().get();
Jettera un NoSuchElementException
(bon!)
Je voudrais cependant qu'il génère une erreur s'il existe plusieurs correspondances. Y a-t-il un moyen de faire cela?
Stream::size
?
Stream
bien plus qu'avant ...
LinkedHashSet
(en supposant que vous souhaitiez conserver l'ordre d'insertion) ou un HashSet
tout le long. Si votre collection n'est utilisée que pour trouver un seul identifiant utilisateur, pourquoi collectez-vous tous les autres éléments? S'il existe un potentiel dont vous aurez toujours besoin pour trouver un identifiant utilisateur qui doit également être unique, alors pourquoi utiliser une liste et non un ensemble? Vous programmez à l'envers. Utilisez la bonne collection pour le travail et épargnez-vous ce mal de tête
count()
est une opération de terminal, vous ne pouvez donc pas le faire. Le flux ne peut pas être utilisé après.