Ich versuche Java 8 Stream
s zu verwenden, um Elemente in a zu finden LinkedList
. Ich möchte jedoch garantieren, dass es nur eine Übereinstimmung mit den Filterkriterien gibt.
Nehmen Sie diesen 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;
}
}
Dieser Code findet eine User
basierend auf ihrer ID. Es gibt jedoch keine Garantie dafür, wie viele User
s zum Filter passen.
Ändern der Filterzeile in:
User match = users.stream().filter((user) -> user.getId() < 0).findAny().get();
Wird ein NoSuchElementException
(gut!) Werfen
Ich möchte, dass es einen Fehler gibt, wenn es mehrere Übereinstimmungen gibt. Gibt es eine Möglichkeit, dies zu tun?
Stream::size
?
Stream
s so viel besser zu verstehen als zuvor ...
LinkedHashSet
Fall stellen Sie fest, dass Sie eine (vorausgesetzt, Sie möchten, dass die Einfügereihenfolge beibehalten wird) oder eine HashSet
ganze Zeit verwenden mussten. Wenn Ihre Sammlung nur zum Auffinden einer einzelnen Benutzer-ID verwendet wird, warum sammeln Sie dann alle anderen Elemente? Wenn es ein Potenzial gibt, dass Sie immer eine Benutzer-ID finden müssen, die ebenfalls eindeutig sein muss, warum dann eine Liste und keine Menge verwenden? Sie programmieren rückwärts. Verwenden Sie die richtige Sammlung für den Job und sparen Sie sich diese Kopfschmerzen
count()
ist eine Terminaloperation, also können Sie das nicht tun. Der Stream kann danach nicht mehr verwendet werden.