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