Javaのlistを分割して処理を実行する(Java7)
はじめに
環境によっては、古いコードをあえて書かなければならない場合も多々あると思います。
Listを分割して処理を実行するコードを Java7 で書く機会があったので、初投稿してみました。
実装
public class Sample {
public static void main(String[] args) {
List<String> sampleList = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee");
int size = 2; // 一度に処理を行うリスト数
for (int i = 0; i < sampleList.size(); i += size) {
List<String> list = new ArrayList<>(
sampleList.subList(i, Math.min(i + size, sampleList.size()))
);
System.out.println(list); // ここで処理を実行する
}
}
}
実行結果
[aaa, bbb] // sampleList.subList(0, 2)
[ccc, ddd] // sampleList.subList(2, 4)
[eee] // sampleList.subList(4, 5)
説明
subList(int from, int to)
はfrom
(含む)からto
(含まない)までのListを返します。
for文でfrom
とto
を分割する数ずつ増やし、処理対象のListを取得しています。
Math.min(int a, int b)
は2つのint値のうち小さいほうを返します。
Listのサイズが分割する数で割り切れない場合は、to
について考慮する必要があり、
最後の繰り返しの場合、to
にsampleList.size()
を入れています。
subListの注意点
subList
で取得したListは元の値とデータを共有しています。つまり、list
の値を変更するとsampleList
の値も変更されます(例1)。
しかし、newしてから変更を行うことで、元のListを変更をせずにsubListのみを変更することが出来ます(例2)。
例1 subListを変更すると、元のlistも変更される。
public class Sample {
public static void main(String[] args) {
List<String> sampleList = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee");
int size = 2; // 一度に処理を行うリスト数
System.out.println(sampleList); // 処理前
for (int i = 0; i < sampleList.size(); i += size) {
List<String> list = sampleList.subList(i, Math.min(i + size, sampleList.size()));
list.set(0, "zzz"); // 処理実行
System.out.println(list);
}
System.out.println(sampleList); // 処理後
}
}
実行結果
[aaa, bbb, ccc, ddd, eee] // 処理前
[zzz, bbb]
[zzz, ddd]
[zzz]
[zzz, bbb, zzz, ddd, zzz] // 処理後
上記の通り、list
を更新した結果、sampleList
も更新されたことが分かる。
例2 newすることで、subListを変更しても元のlistが更新されない。
public class Sample {
public static void main(String[] args) {
List<String> sampleList = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee");
int size = 2; // 一度に処理を行うリスト数
System.out.println(sampleList); // 処理前
for (int i = 0; i < sampleList.size(); i += size) {
List<String> list = new ArrayList<>(
sampleList.subList(i, Math.min(i + size, sampleList.size()))
);
list.set(0, "zzz");
System.out.println(list);
}
System.out.println(sampleList); // 処理後
}
}
実行結果
[aaa, bbb, ccc, ddd, eee] // 処理後
[zzz, bbb]
[zzz, ddd]
[zzz]
[aaa, bbb, ccc, ddd, eee] // 処理後
上記の通り、list
を変更してもsampleList
は変更されないことが分かる。