Filtre Java Flux à 1 et 1 seul élément

Je suis en train d'utiliser Java 8 Streams pour trouver des éléments dans un LinkedList. Je veux garantie, toutefois, qu'il existe un et un seul match pour les critères de filtre.

Prendre 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ée sur leur carte d'identité. Mais il n'y a pas de garanties combien de Users appariés le filtre.

De changer le filtre de ligne à:

User match = users.stream().filter((user) -> user.getId() < 0).findAny().get();

Va jeter un NoSuchElementException (bonne!)

Je le voudrais lever une erreur si il y a des correspondances multiples. Est-il un moyen de faire cela?

count() est un terminal d'exploitation, de sorte que vous ne pouvez pas le faire. Le flux ne peut pas être utilisé après.
Ok, merci @ZouZou. Je n'étais pas tout à fait certaine de ce que cette méthode a fait. Pourquoi n'est-il pas Stream::size ?
Comme un flux de données peut être utilisé une seule fois: le calcul de sa taille signifie "itération" sur elle et après que vous ne pouvez pas utiliser le flux plus.
Wow. Que l'un des commentaires m'ont aidé à comprendre Streams tellement plus que j'ai fait avant...
C'est quand vous vous rendez compte que vous avez eu besoin d'utiliser un LinkedHashSet (en supposant que vous voulez ordre d'insertion conservés) ou un HashSet tout au long de. Si votre collection est uniquement utilisé pour trouver l'id d'utilisateur unique, alors pourquoi êtes-vous la collecte de tous les autres éléments? Si il y a un potentiel que vous aurez toujours besoin de trouver des id utilisateur, qui doit également être unique, alors pourquoi utiliser une liste et non pas un jeu? Vous êtes à la programmation en arrière. Utilisez le bouton droit de la collecte de l'emploi et de l'enregistrer vous-même ce mal de tête

OriginalL'auteur ryvantage | 2014-03-27