Próbuję użyć Java 8 Stream
do znalezienia elementów w LinkedList
. Chcę jednak zagwarantować, że istnieje jedno i tylko jedno dopasowanie do kryteriów filtru.
Weź ten kod:
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;
}
}
Ten kod znajduje się User
na podstawie ich identyfikatora. Ale nie ma gwarancji, ile User
s pasuje do filtra.
Zmiana linii filtra na:
User match = users.stream().filter((user) -> user.getId() < 0).findAny().get();
Rzuci NoSuchElementException
(dobrze!)
Chciałbym jednak, aby generowało błąd, jeśli występuje wiele dopasowań. Czy jest na to sposób?
Stream::size
?
Stream
o wiele więcej niż wcześniej ...
LinkedHashSet
(zakładając, że chcesz zachować porządek wstawiania) lub HashSet
cały czas. Jeśli twoja kolekcja służy tylko do znalezienia jednego identyfikatora użytkownika, to dlaczego zbierasz wszystkie pozostałe elementy? Jeśli istnieje potencjał, że zawsze będziesz musiał znaleźć identyfikator użytkownika, który również musi być unikalny, to po co używać listy, a nie zestawu? Programujesz wstecz. Użyj odpowiedniej kolekcji do pracy i oszczędzaj sobie bólu głowy
count()
jest operacją terminalową, więc nie możesz tego zrobić. Nie można później użyć strumienia.