Sto cercando di usare Java 8 Stream
s per trovare elementi in a LinkedList
. Voglio garantire, tuttavia, che esiste una e una sola corrispondenza ai criteri di filtro.
Prendi questo codice:
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;
}
}
Questo codice trova un in User
base al loro ID. Ma non ci sono garanzie sul numero di User
s corrispondenti al filtro.
Modifica della linea del filtro in:
User match = users.stream().filter((user) -> user.getId() < 0).findAny().get();
Lancerà un NoSuchElementException
(buono!)
Vorrei che generasse un errore se ci sono più partite, però. C'è un modo per fare questo?
Stream::size
?
Stream
molto di più di quello che ho fatto prima ...
LinkedHashSet
(supponendo che tu voglia conservare l'ordine di inserzione) o un HashSet
tutto insieme. Se la tua raccolta viene utilizzata solo per trovare un singolo ID utente, perché raccogli tutti gli altri elementi? Se esiste un potenziale che dovrai sempre trovare un ID utente che deve anche essere univoco, perché usare un elenco e non un set? Stai programmando al contrario. Usa la collezione giusta per il lavoro e risparmia questo mal di testa
count()
è un'operazione terminale quindi non puoi farlo. Lo stream non può essere utilizzato dopo.