Wie kann ich das letzte Element eines Streams oder einer Liste im folgenden Code abrufen?
Wo data.careas
ist ein 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?
Wie Sie sehen können filter
, ist es nicht schwer , das erste Element mit einem bestimmten zu bekommen .
Das letzte Element in einem Einzeiler zu bekommen, ist jedoch ein echtes Problem:
- Es scheint, ich kann es nicht direkt von a erhalten
Stream
. (Es wäre nur für endliche Ströme sinnvoll) - Es scheint auch, dass Sie Dinge wie
first()
undlast()
von derList
Benutzeroberfläche nicht bekommen können, was wirklich ein Schmerz ist.
Ich sehe kein Argument dafür, dass in der Schnittstelle keine first()
und- last()
Methode angegeben List
wird, da die Elemente dort geordnet sind und außerdem die Größe bekannt ist.
Aber gemäß der ursprünglichen Antwort: Wie erhält man das letzte Element eines Endlichen Stream
?
Persönlich ist dies der nächste, den ich bekommen könnte:
int lastIndex = data.careas.stream()
.filter(c -> c.bbox.orientationHorizontal)
.mapToInt(c -> data.careas.indexOf(c)).max().getAsInt();
CArea last = data.careas.get(lastIndex);
Es beinhaltet jedoch die Verwendung eines indexOf
Elements für jedes Element, was Sie im Allgemeinen höchstwahrscheinlich nicht möchten, da es die Leistung beeinträchtigen kann.
Stream
API ist nicht vollständig vergleichbar mitLINQ
da beide in einem sehr unterschiedlichen Paradigma durchgeführt werden. Es ist nicht schlechter oder besser, es ist einfach anders. Und definitiv fehlen einige Methoden, nicht weil Orakelentwickler inkompetent oder gemein sind :)
Iterables.getLast
was Iterable nimmt, aber für die Arbeit optimiert istList
. Ein Haustier ärgern ist, dass es nicht hatgetFirst
. DieStream
API ist im Allgemeinen schrecklich anal und lässt viele bequeme Methoden aus. C # 's LINQ liefert gerne.Last()
und sogar.Last(Func<T,Boolean> predicate)
, obwohl es auch unendlich viele Enumerables unterstützt.