Как я могу получить последний элемент потока или списка в следующем коде?
Где data.careas
является 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?
Как видите, получить первый элемент с определенным filter
несложно.
Однако получить последний элемент в одной строке - настоящая боль:
- Кажется, я не могу получить его прямо из
Stream
. (Это будет иметь смысл только для конечных потоков) - Также кажется, что вы не можете получить такие вещи, как
first()
иlast()
из интерфейсаList
, что действительно является проблемой.
Я не вижу никаких аргументов для того, чтобы не предоставлять метод first()
и last()
в интерфейсе List
, так как элементы там упорядочены, и, кроме того, размер известен.
Но согласно первоначальному ответу: как получить последний элемент конечного Stream
?
Лично это самое близкое, что я мог получить:
int lastIndex = data.careas.stream()
.filter(c -> c.bbox.orientationHorizontal)
.mapToInt(c -> data.careas.indexOf(c)).max().getAsInt();
CArea last = data.careas.get(lastIndex);
Однако это подразумевает использование indexOf
для каждого элемента, что, скорее всего, нежелательно, поскольку это может ухудшить производительность.