Comment puis-je obtenir le dernier élément d'un flux ou d'une liste dans le code suivant?
Où data.careas
est un List<CArea>
:
CArea first = data.careas.stream()
.filter(c -> c.bbox.orientationHorizontal).findFirst().get();
CArea last = data.careas.stream()
.filter(c -> c.bbox.orientationHorizontal)
.collect(Collectors.toList()).; //how to?
Comme vous pouvez le voir, obtenir le premier élément, avec un certain filter
, n'est pas difficile.
Cependant, obtenir le dernier élément d'un one-liner est une vraie douleur:
- Il semble que je ne puisse pas l'obtenir directement à partir d'un fichier
Stream
. (Cela n'aurait de sens que pour les flux finis) - Il semble également que vous ne pouvez pas obtenir des choses comme
first()
et àlast()
partir de l'List
interface, ce qui est vraiment pénible.
Je ne vois aucun argument pour ne pas fournir une méthode first()
and last()
dans l' List
interface, car les éléments y sont ordonnés et de plus la taille est connue.
Mais selon la réponse originale: comment obtenir le dernier élément d'un fini Stream
?
Personnellement, c'est le plus proche que je puisse obtenir:
int lastIndex = data.careas.stream()
.filter(c -> c.bbox.orientationHorizontal)
.mapToInt(c -> data.careas.indexOf(c)).max().getAsInt();
CArea last = data.careas.get(lastIndex);
Cependant, cela implique l'utilisation d'un indexOf
élément sur chaque élément, ce qui n'est probablement pas souhaité car cela peut nuire aux performances.
Stream
L'API n'est pas entièrement comparable LINQ
car les deux sont réalisés dans un paradigme très différent. Ce n'est ni pire ni meilleur, c'est juste différent. Et certainement certaines méthodes sont absentes non pas parce que les développeurs oracle sont incompétents ou méchants :)
Iterables.getLast
ce qui prend Iterable mais est optimisé pour fonctionner avecList
. Une bête noire, c'est qu'il n'en a pasgetFirst
. L'Stream
API en général est horriblement anale, omettant de nombreuses méthodes pratiques. LINQ de C #, par contraste, est heureux de fournir.Last()
et même.Last(Func<T,Boolean> predicate)
, même s'il prend également en charge des Enumerables infinis.