143

次のコードで、ストリームまたはリストの最後の要素を取得するにはどうすればよいですか?

はどこ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()andlast()メソッドを提供しないという議論はありません。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すべての要素を使用する必要がありますが、これはパフォーマンスを損なう可能性があるため、通常は望ましくありません。

4

8 に答える 8

50

Collection (またはより一般的な Iterable) がある場合は、Google Guava を使用できます

Iterables.getLast(myIterable)

便利なワンライナーとして。

于 2015-10-07T07:34:53.917 に答える
0

以下のように skip() 関数を使用することもできます...

long count = data.careas.count();
CArea last = data.careas.stream().skip(count - 1).findFirst().get();

使い方はとても簡単です。

于 2018-07-03T10:50:02.857 に答える