Java 8でインデックスを使ってStreamを反復処理する方法
Java 8のStream APIには、要素と同時にインデックスを取得する機能が標準では用意されていません。しかし、AtomicIntegerクラスを活用することで、各要素にインデックスを付けながらStreamを反復処理できます。以下に具体的な実装例を示します。
サンプルコード
import java.util.stream.IntStream;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
public class Demo{
public static void main(String[] args){
String[] my_array = { "T", "h", "i", "s", "s","a", "m", "p", "l", "e" };
AtomicInteger my_index = new AtomicInteger();
System.out.println("The elements in the string array are :");
Arrays.stream(my_array).map(str -> my_index.getAndIncrement() + " -> " + str).forEach(System.out::println);
}
}
出力結果
The elements in the string array are : 0 -> T 1 -> h 2 -> i 3 -> s 4 -> s 5 -> a 6 -> m 7 -> p 8 -> l 9 -> e
コードの解説
まず、Demoという名前のクラス内にmainメソッドが定義されています。このメソッドでは、文字列型の配列my_arrayを宣言し、続いてAtomicIntegerクラスのインスタンスmy_indexを生成しています。
Arrays.stream()メソッドで配列からStreamを作成し、map()操作の中でgetAndIncrement()関数を呼び出します。この関数は現在の値を返した後、カウンターを1つ増やす動作をするため、各要素に対して0から始まる連番を自動的に付与できます。最終的に、インデックスと要素が「0 -> T」のような形式で結合され、forEach(System.out::println)によってコンソールへ1行ずつ出力されます。
なぜAtomicIntegerを使うのか
ラムダ式やStreamの内部から参照されるローカル変数は、事実上final(effectively final)である必要があります。通常のint変数は再代入できないためカウンターとして利用できませんが、AtomicIntegerはオブジェクトの内部状態を更新できるうえ、スレッドセーフに動作するため、並列ストリームでも安全にインデックスを管理できます。
別のアプローチ:IntStreamを活用する方法
IntStream.range()を使えば、インデックスを明示的に生成しながら配列要素へアクセスすることも可能です。逐次処理の場合はこちらの方が直感的に理解しやすいでしょう。
IntStream.range(0, my_array.length)
.forEach(i -> System.out.println(i + " -> " + my_array[i]));
-
Pythonで指定されたインデックスに基づいて文字列をシャッフルする方法
文字列 s とインデックスのリスト ind が与えられ、両者は同じ長さであるとします。文字列 s は、位置 i にある文字が最終的な文字列内の ind[i] の位置へ移動するようにシャッフルされます。このとき、シャッフル後の最終的な文字列を求める必要があります。例えば、入力が s = ktoalak、ind = [0,5,1,6,2,4,3] の場合、出力は kolkata となります。解決手順この問題を解くには、以下の手順に従います。fin_str を s と同じサイズのリストとして作成し、0で初期化するs 内の各インデックス i と各文字 v に対して、次の操作を行うfin_str[ind
-
Java 8 Streamsチュートリアル – コード例で学ぶStream APIの基本と使い方
この記事では、Java 8のStreams(ストリーム)機能について詳しく解説し、さまざまなコード例を交えながらその使い方を紹介します。 Java StreamsはJavaに関数型プログラミングをもたらす強力な機能です。Java 8から導入されたため、それ以前のバージョンを使用している場合は、Java 8以降へのアップグレードが必要です。 なぜJava Streamsを使うべきなのか? Streamsには以下のようなメリットがあります。 少ないコード量で多くを実現できる — ごくわずかな行数のコードで、従来は多くの記述が必要だった処理を簡潔に実装できます。 ラムダ式を活用できる — 使い捨て