ホームページ  >  記事  >  Java  >  Java でストリームを逆転する方法: 特定のアプローチと一般的なアプローチ?

Java でストリームを逆転する方法: 特定のアプローチと一般的なアプローチ?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-30 13:18:03600ブラウズ

How to Reverse Streams in Java: Specific and Generic Approaches?

Java でのストリームの反転: 一般的アプローチと具体的なアプローチ

Java ストリームを扱う場合、ストリームを反転する方法を理解することが重要です。ストリームを反転するための具体的および一般的なアプローチを詳しく見てみましょう。

具体的なアプローチ: IntStream の反転

範囲を維持しながら IntStream を反転するには、次の方法を利用できます。アプローチ:

<code class="java">static IntStream revRange(int from, int to) {
    return IntStream.range(from, to)
                    .map(i -> to - i + from - 1);
}</code>

このメソッドは、不必要なボックス化および並べ替え操作を回避します。

一般的なアプローチ: 任意のタイプのストリームを反転する

次のストリームの場合任意の型を元に戻すための事前定義された「適切な」方法は現在ありません。ただし、一般的なオプションが 2 つあります:

1.配列を使用した反転:

このメソッドは、ストリーム要素を配列に格納し、逆の順序で取得します:

<code class="java">@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]);
}</code>

2。コレクターを使用した反転:

このメソッドは、コレクターを使用して反転リストに要素を蓄積します:

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

ArrayDeque を使用した効率的な反転

O(N^2) のコピー効率が悪いため、前方への挿入をより効率的にするために ArrayDeque を使用して以前のコードを更新します。

<code class="java">Deque<String> output =
    input.collect(Collector.of(
        ArrayDeque::new,
        (deq, t) -> deq.addFirst(t),
        (d1, d2) -> { d2.addAll(d1); return d2; }));</code>

このメソッドは、簡単に変換できる逆の Deque を生成します。ストリームに戻すか、直接反復処理します。

以上がJava でストリームを逆転する方法: 特定のアプローチと一般的なアプローチ?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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