如何在以下代码中获取流或列表的最后一个元素?
哪里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()and 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在每个元素上使用on,这通常是您通常不希望的,因为它会影响性能。
StreamAPI不能完全与之媲美,LINQ因为两者都是在非常不同的范例中完成的。它并不差或更好,只是不同。肯定没有某些方法不是因为oracle开发人员不称职或刻薄:)
Iterables.getLastIterable,但经过优化可与一起使用List。令人讨厌的是它没有getFirst。该StreamAPI通常是可怕的肛门,省略了许多便利方法。相比之下,C#的LINQ很乐意提供.Last(),甚至.Last(Func<T,Boolean> predicate),甚至也支持无限的Enumerables。