Как я могу получить последний элемент потока или списка в следующем коде?
Где 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 для каждого элемента, что, скорее всего, нежелательно, поскольку это может ухудшить производительность.