Java ストリームを逆転する方法: 総合ガイド
はじめに
Java でのストリームの逆転8 は、さまざまなシナリオで共通の要件となる可能性があります。この記事では、特定のケースと一般的なケースの両方に対処しながら、ストリームの反転を実現するための効果的な手法について詳しく説明します。
特定のケース: IntStream の反転
IntStream を反転するには、カスタマイズされたアプローチ必要です。次の revRange メソッドは、指定された範囲内で逆向きの IntStream を生成します。
<code class="java">static IntStream revRange(int from, int to) { return IntStream.range(from, to) .map(i -> to - i + from - 1); }</code>
一般的なケース: 任意のタイプのストリームの反転
任意のタイプの一般的なストリームの場合、いくつかのアプローチがあります:
1.要素の格納と逆順:
ストリーム要素を配列に格納し、逆の順序で読み取ります:
<code class="java">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>
3.効率的なリスト反転 (更新 2016-01-29):
非効率を避けるために、前方での挿入を効率的にサポートする 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>
概要
これらの手法は、Java 8 ストリームを逆転する効果的な方法を提供します。特定の IntStream については、revRange が専用のソリューションです。一般的なストリームの場合、要素を保存するか、リストに収集することが実用的なオプションとなります。リストに収集する際の効率を最適化するには、ArrayDeque を使用する必要があります。
以上がJava 8 でストリームを逆にする方法: 包括的なガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。