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 サイトの他の関連記事を参照してください。