ホームページ  >  記事  >  Java  >  Java 8 ストリームを効率的に反転するには?

Java 8 ストリームを効率的に反転するには?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-30 05:57:03368ブラウズ

How to Reverse a Java 8 Stream Efficiently?

Java 8 ストリームの反転

Java 8 では、ストリームはデータを操作および処理するための強力かつ簡潔な方法を提供します。一般的な操作の 1 つは、ストリームを逆にすることです。この記事では、これを実現するための 2 つの方法について説明します。IntStream を反転するための特定のソリューションと、オブジェクトのストリームを反転するための一般的なアプローチです。

Specific IntStream Reversal

To reverse IntStream を使用すると、値の範囲を逆順にマップするカスタム メソッドを作成できます。たとえば、-5 から 0 の範囲の IntStream がある場合、それを反転すると、ストリームは 0 から -5 になります。これは、次のコードを使用して実現できます。

static IntStream revRange(int from, int to) {
    return IntStream.range(from, to)
                    .map(i -> to - i + from - 1);
}

このメソッドはボックス化とソートを回避し、より効率的なソリューションになります。

Generic Stream Reversal

任意のオブジェクト タイプのストリームを反転するには、2 つのアプローチを使用できます。 1 つ目は、ストリーム要素を配列に格納し、逆の順序で読み出すことです。

@SuppressWarnings("unchecked")
static <T> Stream<T> reverse(Stream<T> input) {
    Object[] temp = input.toArray();
    return (Stream<T>) IntStream.range(0, temp.length)
                                .mapToObj(i -> temp[temp.length - i - 1]);
}

このアプローチは簡単ですが、中間配列の作成が必要です。

もう 1 つの手法は次のとおりです。コレクターを使用して項目を反転リストに蓄積します:

Stream<T> input = ... ;
List<T> output =
    input.collect(ArrayList::new,
                  (list, e) -> list.add(0, e),
                  (list1, list2) -> list1.addAll(0, list2));

このオプションではストリーム要素の保存も必要ですが、先頭に挿入のある ArrayList を使用することでコピーの必要がなくなります。

要素を保存せずにストリームを元に戻す「適切な」方法はないことに注意してください。ただし、ここで紹介する方法は、特定の IntStream 反転と一般的なストリーム反転の両方に対して効率的で多用途のソリューションを提供します。

以上がJava 8 ストリームを効率的に反転するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。