当サイトは、アフィリエイト広告を利用しています

【java8】Streamでlist結合(マージ)する

作成日:2022月07月28日
更新日:2023年12月14日

javaのArrayListをjava8のstreamを使って結合(マージ)する方法を調べたので
忘備録として残す。

下記の本では streamAPI についても詳しく書いてありおススメです!

また当ブログで紹介しているjava8のstreamAPIを使った
コレクションや配列の操作方法を
下記記事でメソッド別にまとめています!

Stream.concatを使う

Personクラスを用意する

Personクラス

Person.java
public class Person {
private final int id;
private final String name;
private final String address;
private final int age;
Person(int id,String name, String address,int age) {
this.id = id;
this.name = name;
this.address = address;
this.age = age;
}
public int getId() {
return this.id;
}
public String getName() {
return this.name;
}
public String getAddress() {
return this.address;
}
public int getAge() {
return this.age;
}
@Override
public String toString()
{
return "{" + this.id + " " + this.name + " " + this.address + " " + this.age +"}";
}
}

list結合処理

PersonクラスのオブジェクトのListを二つ作り
Stream.concatを使って結合する

Stream.concat
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.*;
public class Main {
public static void main(String[] args) throws Exception {
// 一つ目のList
List<Person>listA = new ArrayList<>();
for(int i=0;i<5;i++){
Person pobj = new Person(i,"Name"+i,"東京"+i,i + 10);
listA.add(pobj);
}
// 二つ目のList
List<Person>listB = new ArrayList<>();
for(int i=5;i<10;i++){
Person pobj = new Person(i,"Name"+i,"東京"+i,i + 10);
listB.add(pobj);
}
// Stream.concatで結合
List<Person> margeList = Stream.concat(listA.stream(), listB.stream())
.collect(Collectors.toList());
System.out.println(margeList);
}
}

結果を実行して確認する

【java8】Stream.concatでList結合

二つのListは結合されている 注意としては結合する二つのListに格納されている オブジェクトの型は同じである必要がある

flatMapを使う

streamのflatMapを使う場合は複数のlistを結合することができる。

flatMap
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.*;
public class Main {
public static void main(String[] args) throws Exception {
// 一つ目のList
List<Person>listA = new ArrayList<>();
for(int i=0;i<5;i++){
Person pobj = new Person(i,"Name"+i,"東京"+i,i + 10);
listA.add(pobj);
}
// 二つ目のList
List<Person>listB = new ArrayList<>();
for(int i=5;i<10;i++){
Person pobj = new Person(i,"Name"+i,"東京"+i,i + 10);
listB.add(pobj);
}
// 三つ目のList
List<Person>listC = new ArrayList<>();
for(int i=10;i<15;i++){
Person pobj = new Person(i,"Name"+i,"東京"+i,i + 10);
listB.add(pobj);
}
// flatMapで結合
List<Person> margeList = Stream.of(listA, listB,listC)
.flatMap(lst -> lst.stream())
.collect(Collectors.toList());
System.out.println(margeList);
}
}

結果を実行して確認する

【java8】flatMapでLIst結合

Streamを使わない

streamを使わずに結合することもできる

addAll
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.*;
public class Main {
public static void main(String[] args) throws Exception {
// 一つ目のList
List<Person>listA = new ArrayList<>();
for(int i=0;i<5;i++){
Person pobj = new Person(i,"Name"+i,"東京"+i,i + 10);
listA.add(pobj);
}
// 二つ目のList
List<Person>listB = new ArrayList<>();
for(int i=5;i<10;i++){
Person pobj = new Person(i,"Name"+i,"東京"+i,i + 10);
listB.add(pobj);
}
// 三つ目のList
List<Person>listC = new ArrayList<>();
for(int i=10;i<15;i++){
Person pobj = new Person(i,"Name"+i,"東京"+i,i + 10);
listB.add(pobj);
}
// addAllで結合
List<Person> margeList = new ArrayList<>();
margeList.addAll(listA);
margeList.addAll(listB);
margeList.addAll(listC);
System.out.println(margeList);
}
}

結果を実行して確認する

【java】addAllで結合

まとめ

今まではaddAllでlist結合していたがStreamを使ってもできることがわかった。
個人的にはSteam.ofからのflatMapが一番かっこいいので使っていきたいが
可読性を考えるとaddAllの方がいいような気がする。

参考

新着記事

タグ別一覧
top