72 votes

Stream moyen pour obtenir l'index du premier élément correspondant booléen

J'ai un List<Users>. Je veux obtenir l'index de la (première) de l'utilisateur dans le flux avec un nom d'utilisateur particulier. Je ne veux pas réellement besoin de l' User être .equals() pour certains décrite User, juste pour avoir le même nom d'utilisateur.

Je ne peux penser à de mauvaises manières de le faire (itérer et compter), mais il se sent comme il devrait être une belle façon de le faire, probablement en utilisant Ruisseaux. Jusqu'à présent, le meilleur que j'ai est:

int index = users.stream()
    .map(user -> user.getName())
    .collect(Collectors.toList())
    .indexOf(username);

Ce qui n'est pas le pire de code que j'ai jamais écrit, mais ce n'est pas grand. C'est pas non plus souple, car il repose sur l'existence d'une fonction de mappage à un type avec un .equals() fonction qui décrit la propriété que vous recherchez, je préfère avoir quelque chose qui pourrait fonctionner pour arbitraire Function<T, Boolean>

Quelqu'un sait comment?

100voto

vsminkov Points 7564

Parfois, il n'y a pas zipWithIndex pythonique en java. Alors je suis tombé sur quelque chose comme ça:

 OptionalInt indexOpt = IntStream.range(0, users.size())
     .filter(i -> searchName.equals(users.get(i)))
     .findFirst();
 

Sinon, vous pouvez utiliser zipWithIndex de la bibliothèque protonpack

Remarque

Cette solution peut prendre beaucoup de temps si users.get n’est pas une opération à temps constant.

20voto

AmanSinghal Points 958

Essaye ça:

 IntStream.range(0, users.size())
    .filter(userInd-> users.get(userInd).getName().equals(username))
    .findFirst()
    .get();
 

11voto

SerCe Points 3048

Vous pouvez essayer la bibliothèque StreamEx faite par Tagir Valeev . Cette bibliothèque a une méthode pratique #indexOf.

Voici un exemple simple:

 List<User> users = asList(new User("Vas"), new User("Innokenty"), new User("WAT"));
long index = StreamEx.of(users)
        .indexOf(user -> user.name.equals("Innokenty"))
        .getAsLong();
System.out.println(index);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X