Estoy tratando de usar Java 8 Stream
s para encontrar elementos en a LinkedList
. Sin embargo, quiero garantizar que haya una y solo una coincidencia con los criterios de filtro.
Toma este código:
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;
}
}
Este código encuentra un User
basado en su ID. Pero no hay garantías de cuántos User
coinciden con el filtro.
Cambiar la línea del filtro a:
User match = users.stream().filter((user) -> user.getId() < 0).findAny().get();
Lanzará un NoSuchElementException
(¡bueno!)
Sin embargo, me gustaría que arroje un error si hay varias coincidencias. ¿Hay alguna forma de hacer esto?
Stream::size
?
Stream
mucho más de lo que lo hice antes ...
LinkedHashSet
(suponiendo que desea preservar el orden de inserción) o HashSet
todo el tiempo. Si su colección solo se utiliza para encontrar una única identificación de usuario, ¿por qué está recopilando todos los demás elementos? Si existe la posibilidad de que siempre necesite encontrar alguna identificación de usuario que también deba ser única, ¿por qué usar una lista y no un conjunto? Estás programando al revés. Use la colección adecuada para el trabajo y
count()
es una operación de terminal, así que no puedes hacer eso. La secuencia no se puede usar después.