次のコードでストリームまたはリストの最後の要素を取得するにはどうすればよいですか?
どこ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
、すべての要素でon を使用する必要があります。これは、パフォーマンスを損なう可能性があるため、通常は必要ない可能性があります。
Stream
れるLINQ
ため、APIは完全に比較することはできません。良くも悪くもないだけです。そして、間違いなくいくつかの方法が欠落しているのは、Oracle
Iterables.getLast
Iterableを提供しますが、で動作するように最適化されていList
ます。ペットのうわさがありませんgetFirst
。Stream
一般的に、APIは、便利なメソッドの多くを省略し、恐ろしく肛門です。C#のLINQは、無限の列挙型もサポートしていますが、対照的に、喜んで提供.Last()
し.Last(Func<T,Boolean> predicate)
ます。