概要
Java 8 でストリームを反復しながらインデックスにアクセスするには、特に LINQ の対応物と比較すると、退屈なタスクです。この記事では、この機能を実現するための簡潔で効率的な方法について説明します。
中間ソリューション
1 つのアプローチは、インデックスのストリームと要素のストリームを結合することです。 zip方式。ただし、このメソッドは移動または削除されたため、このアプローチはアクセスしにくくなっています。
最もクリーンな方法: インデックスから
より合理化されたソリューションは、インデックスの流れ。これは、IntStream.range() を使用して実現でき、フィルタリングおよびマッピング操作の便利な開始点を提供します。
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());
可変インデックスの使用
別の代替方法は次のとおりです。 AtomicInteger のような可変オブジェクトを使用してアドホック カウンターを維持します。このアプローチは従来の for ループに似ています。
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());
並列ストリームに関する注意
この後者の方法を並列ストリームで使用すると、問題が発生する可能性があることに注意することが重要です。順番に処理されない場合があります。
以上がJava 8 ストリームを効率的に繰り返してインデックスにアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。