Flux de Façon à obtenir l'indice du premier élément correspondant boolean

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 la User être .equals() à certains décrit 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>

Ce que quelqu'un sait comment faire?

  • Pourquoi "itérer" laid?
  • Les ruisseaux et l'indexation ne se mélangent pas bien. Vous êtes généralement mieux de revenir à une ancienne boucle à ce point.
  • La chose que j'aime sur les cours d'eau est la séparation de la collecte liée à la logique de la chose qui est demandé. Dans ce cas, il y a une tonne de différentes questions qui pourraient être posées qui ne varient qu'à partir de la base Function<T, Boolean>, de sorte qu'il se sent comme il devrait y avoir un moyen de gérer que des résumés à partir de la collection générale de la logique.
  • Ce qui vous empêche d'utiliser un Function<T, Boolean> dans un if énoncé à l'intérieur d'un for boucle? Pourquoi voulez-vous utiliser Function<T, Boolean> lorsque vous avez Predicate<T>?
  • Parce que là, vous êtes manuellement décrivant l'ensemble de la structure du code, plutôt que d'avoir que compartimentée. Pour l'autre question, j'ai juste oublié que Predicate était une chose.
  • Neat Java 11 solution: int index = users.stream().map(User::getName).takeWhile(not(username::equals)).count();