背景
Javaのリストの操作、たまに忘れがちだな…ってことで自分への備忘録も兼ねてまとめてみます。
定義更新していきます。
今回ご紹介するリストの操作
- 年齢が最大値
- 年齢が最小値
- 指定の年齢に一致する要素 (例: 25歳)
- 指定の名前に一致する要素 (例: "烈海王")
- 指定の性別に一致する要素全て (例: Female)
- リストAとリストBで、リストAに含まれる値のみ抽出
- リストAとリストBで重複を除いてマージしたリストCを作る(名前で重複排除)
コード
public class Student {
private String name;
private int no;
private String gender;
private int age;
public Student(String name, int no, String gender, int age) {
this.name = name;
this.no = no;
this.gender = gender;
this.age = age;
}
public String getName() {
return name;
}
public int getNo() {
return no;
}
public String getGender() {
return gender;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Student{" + "name='" + name + '\'' + ", no=" + no + ", gender='" + gender + '\'' + ", age=" + age + '}';
}
}
import java.util.*;
import java.util.stream.*;
public class Main {
public static void main(String[] args) {
List<Student> studentsA = new ArrayList<>();
studentsA.add(new Student("範馬刃牙", 1, "Male", 18));
studentsA.add(new Student("範馬勇次郎", 2, "Male", 40));
studentsA.add(new Student("花山薫", 3, "Male", 19));
studentsA.add(new Student("愚地独歩", 4, "Male", 50));
studentsA.add(new Student("烈海王", 5, "Male", 30));
studentsA.add(new Student("ジャック・ハンマー", 6, "Male", 25));
studentsA.add(new Student("郭海皇", 7, "Male", 146));
studentsA.add(new Student("渋川剛気", 8, "Male", 75));
studentsA.add(new Student("本部以蔵", 9, "Male", 45));
studentsA.add(new Student("松本梢江", 10, "Female", 18));
List<Student> studentsB = new ArrayList<>();
// studentsAにもいる3人
studentsB.add(new Student("範馬刃牙", 1, "Male", 18));
studentsB.add(new Student("烈海王", 2, "Male", 30));
studentsB.add(new Student("松本梢江", 3, "Female", 18));
// 新しい7人
studentsB.add(new Student("ドリアン", 4, "Male", 60));
studentsB.add(new Student("シコルスキー", 5, "Male", 28));
studentsB.add(new Student("スペック", 6, "Male", 97));
studentsB.add(new Student("柳龍光", 7, "Male", 70));
studentsB.add(new Student("ピクル", 8, "Male", 2000000)); // 氷漬け恐竜時代
studentsB.add(new Student("ビスケット・オリバ", 9, "Male", 35));
studentsB.add(new Student("ガイア", 10, "Male", 29));
// 1. 年齢が最大値
int maxAge = studentsA.stream().mapToInt(Student::getAge).max().orElseThrow(); // もしリストが空なら例外
System.out.println("最大年齢: " + maxAge);
// 2. 年齢が最小値
int minAge = studentsA.stream().mapToInt(Student::getAge).min().orElseThrow(); // もしリストが空なら例外
System.out.println("最小年齢: " + minAge);
// 3. 指定の年齢に一致する要素 (例: 25歳)
Student student = studentsA.stream().filter(s -> s.getAge() == 25).findFirst().orElse(null); // 該当がない場合null
System.out.println("25歳の学生: " + student);
// 4. 指定の名前に一致する要素 (例: "烈海王")
student = studentsA.stream().filter(s -> s.getName().equals("烈海王")).findFirst().orElse(null);
System.out.println("名前が烈海王: " + student);
// 5. 指定の性別に一致する要素全て (例: Female)
List<Student> females = studentsA.stream().filter(s -> s.getGender().equals("Female")).collect(Collectors.toList());
System.out.println("性別 Female の学生: " + females);
// 6. リストAとリストBで、リストAに含まれる値のみ抽出
List<Student> onlyInA = studentsA.stream().filter(a -> studentsB.stream().noneMatch(b -> b.getName().equals(a.getName()))).collect(Collectors.toList());
System.out.println("Aにしかいない学生: " + onlyInA);
// 7. リストAとリストBで重複を除いてマージしたリストCを作る(名前で重複排除)
List<Student> studentsC = Stream.concat(studentsA.stream(), studentsB.stream())
.collect(Collectors.collectingAndThen(Collectors.toMap(Student::getName, s -> s, (s1, s2) -> s1), // name をキーにして重複排除
m -> new ArrayList<>(m.values())));
System.out.println("マージ後 (名前で重複排除): " + studentsC);
}
}
結果
-
- 最大年齢: 146
-
- 最小年齢: 18
-
- 25歳の学生: Student{name='ジャック・ハンマー', no=6, gender='Male', age=25}
-
- 名前が烈海王: Student{name='烈海王', no=5, gender='Male', age=30}
-
- 性別 Female の学生: [Student{name='松本梢江', no=10, gender='Female', age=18}]
-
- Aにしかいない学生: [Student{name='範馬勇次郎', no=2, gender='Male', age=40}, Student{name='花山薫', no=3, gender='Male', age=19}, Student{name='愚地独歩', no=4, gender='Male', age=50}, Student{name='ジャック・ハンマー', no=6, gender='Male', age=25}, Student{name='郭海皇', no=7, gender='Male', age=146}, Student{name='渋川剛気', no=8, gender='Male', age=75}, Student{name='本部以蔵', no=9, gender='Male', age=45}]
-
- マージ後 (名前で重複排除): [Student{name='烈海王', no=5, gender='Male', age=30}, Student{name='愚地独歩', no=4, gender='Male', age=50}, Student{name='ピクル', no=8, gender='Male', age=2000000}, Student{name='スペック', no=6, gender='Male', age=97}, Student{name='松本梢江', no=10, gender='Female', age=18}, Student{name='郭海皇', no=7, gender='Male', age=146}, Student{name='ジャック・ハンマー', no=6, gender='Male', age=25}, Student{name='範馬刃牙', no=1, gender='Male', age=18}, Student{name='ビスケット・オリバ', no=9, gender='Male', age=35}, Student{name='ガイア', no=10, gender='Male', age=29}, Student{name='柳龍光', no=7, gender='Male', age=70}, Student{name='ドリアン', no=4, gender='Male', age=60}, Student{name='範馬勇次郎', no=2, gender='Male', age=40}, Student{name='シコルスキー', no=5, gender='Male', age=28}, Student{name='本部以蔵', no=9, gender='Male', age=45}, Student{name='花山薫', no=3, gender='Male', age=19}, Student{name='渋川剛気', no=8, gender='Male', age=75}]