Java 8 での簡潔なインデックスベースのストリーム反復
多くのプログラミング タスクでは、対応するインデックスにアクセスしながらデータ構造を反復処理する必要があります。 Java 8 ストリームは、ストリーム処理のための幅広い操作を提供しますが、反復中にインデックスを取得する明示的な方法はありません。
提供されている Java コードは、IntStream、boxed()、zip() を使用したかなり冗長なアプローチを示しています。 )、filter()、map()、およびcollect()。望ましい結果は得られますが、その長さと複雑さがその優雅さを損ないます。
最もクリーンな方法:
最も簡潔なアプローチは、インデックスのストリームから開始することです:
String[] names = {"Sam", "Pamela", "Dave", "Pascal", "Erik"}; IntStream.range(0, names.length) .filter(i -> names[i].length() <= i) .mapToObj(i -> names[i]) .collect(Collectors.toList());
このメソッドは、0 から配列の長さまでのインデックスのストリームを構築し、対応する文字列の長さに基づいてインデックスを取得し、インデックスを対応する文字列にマップし、結果をリストに収集します。
代替方法:
別のオプションは次のとおりです。 AtomicInteger のような可変オブジェクトを使用してアドホック インデックス カウンターを維持するには:
String[] names = {"Sam", "Pamela", "Dave", "Pascal", "Erik"}; AtomicInteger index = new AtomicInteger(); List<String> list = Arrays.stream(names) .filter(n -> n.length() <= index.incrementAndGet()) .collect(Collectors.toList());
このメソッドfor ループベースのインデックス増加の使いやすさを維持します。ただし、並列ストリームでこのメソッドを使用すると、並列処理の順序が非決定的であるため、誤った動作が発生する可能性があることに注意してください。
以上がインデックス アクセスを使用して Java 8 ストリームを効率的に反復するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。