ホームページ >Java >&#&チュートリアル >インデックス アクセスを使用して Java 8 ストリームを効率的に反復するにはどうすればよいですか?

インデックス アクセスを使用して Java 8 ストリームを効率的に反復するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-18 14:32:17546ブラウズ

How Can I Efficiently Iterate Through a Java 8 Stream with Index Access?

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

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