当サイトは、アフィリエイト広告を利用しています
javaのArrayListをjava8のstreamを使って結合(マージ)する方法を調べたので
忘備録として残す。
下記の本では streamAPI についても詳しく書いてありおススメです!
また当ブログで紹介しているjava8のstreamAPIを使った
コレクションや配列の操作方法を
下記記事でメソッド別にまとめています!
Personクラスを用意する
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;}@Overridepublic String toString(){return "{" + this.id + " " + this.name + " " + this.address + " " + this.age +"}";}}
PersonクラスのオブジェクトのListを二つ作り
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 {// 一つ目のListList<Person>listA = new ArrayList<>();for(int i=0;i<5;i++){Person pobj = new Person(i,"Name"+i,"東京"+i,i + 10);listA.add(pobj);}// 二つ目のListList<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);}}
streamのflatMapを使う場合は複数のlistを結合することができる。
import java.util.*;import java.util.stream.Collectors;import java.util.stream.*;public class Main {public static void main(String[] args) throws Exception {// 一つ目のListList<Person>listA = new ArrayList<>();for(int i=0;i<5;i++){Person pobj = new Person(i,"Name"+i,"東京"+i,i + 10);listA.add(pobj);}// 二つ目のListList<Person>listB = new ArrayList<>();for(int i=5;i<10;i++){Person pobj = new Person(i,"Name"+i,"東京"+i,i + 10);listB.add(pobj);}// 三つ目のListList<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);}}
streamを使わずに結合することもできる
import java.util.*;import java.util.stream.Collectors;import java.util.stream.*;public class Main {public static void main(String[] args) throws Exception {// 一つ目のListList<Person>listA = new ArrayList<>();for(int i=0;i<5;i++){Person pobj = new Person(i,"Name"+i,"東京"+i,i + 10);listA.add(pobj);}// 二つ目のListList<Person>listB = new ArrayList<>();for(int i=5;i<10;i++){Person pobj = new Person(i,"Name"+i,"東京"+i,i + 10);listB.add(pobj);}// 三つ目のListList<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);}}
今まではaddAllでlist結合していたがStreamを使ってもできることがわかった。
個人的にはSteam.ofからのflatMapが一番かっこいいので使っていきたいが
可読性を考えるとaddAllの方がいいような気がする。