#streamを使ってみよう
###1. 使用するオブジェクト
class People {
private String name;
private int age;
private int gender;
public People(String name, int age, int gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public People(String name, int age, int gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String toString() {
return "People(name=" + name + ", age=" + age + ", gender=" + gender + ")";
}
public static List<People> getPeopleList() {
return Arrays.asList(
new People("any", 17, 2),
new People("tom", 12, 1),
new People("jerry", 15, 2),
new People("scott", 18, 1),
new People("paul", 20, 1)
);
}
/** セッター、ゲッターは省略*/
2.stream使わない場合の例
System.out.println("女性リスト");
for (People people : People.getPeopleList()){
if(people.getGender() == 2) {
System.out.println(people);
}
}
3.上記と同じ処理をStreamを使った場合
List<People> femaleList = People.getPeopleList().stream()
.filter(people -> people.getGender() == 2).collect(Collectors.toList());
System.out.println("女性リスト");
femaleList.forEach(System.out::println);
4.streamのsortedメソッドを使用例 (整列を行う)
List<People> sortedList = People.getPeopleList().stream()
.sorted(Comparator.comparing(People::getAge)).collect(Collectors.toList());
System.out.println("年齢順リスト");
sortedList.forEach(System.out::println);
5.streamのallMatchメソッドを使用例 (指定した条件にすべて項目が一致するか)
//stream allMatch 利用 すべての項目が条件を一致するか
boolean allMatch = People.getPeopleList().stream().allMatch(people -> people.getAge() > 12);
System.out.println("全員の年齢が13歳以上であるか");
System.out.println(allMatch);
6.streamのanyMatch メソッドを使用例 (指定した条件に一致する項目が存在するか)
boolean anyMatch = People.getPeopleList().stream().anyMatch(people -> people.getAge() > 19);
System.out.println("年齢が20歳以上の方がいるか");
System.out.println(anyMatch);
7.streamのnoneMatch メソッドを使用例 (指定した条件にすべて項目が一致すしないか)
boolean noneMatch = People.getPeopleList().stream().noneMatch(people -> people.getAge() < 10);
System.out.println("年齢が10歳未満の方がいるか");
System.out.println(noneMatch);
8.streamのmax メソッドを使用例 (最大値を持っているリストを取得)
Optional<People> maxPeople = People.getPeopleList().stream().max(Comparator.comparing(People::getAge));
if(maxPeople.isPresent()){
System.out.println("一番延長者の方は");
System.out.println(maxPeople.get());
}
9.streamのminメソッドを使用例 (最小値を持っているリストを取得)
Optional<People> minPeople = People.getPeopleList().stream().min(Comparator.comparing(People::getAge));
if(minPeople.isPresent()){
System.out.println("一番若い方は");
System.out.println(minPeople.get());
}
10.streamのcollect, Collectors.groupingByメソッドを使用例
/** (特定フィールドでグループを作りマップを生成) */
Map<Integer, List<People>> groupByGender = People.getPeopleList().stream()
.collect(Collectors.groupingBy(People::getGender));
System.out.println("男性/女性 リスト");
groupByGender.forEach((gender,peopleList) -> {
System.out.println(gender);
peopleList.forEach(System.out::println);
});
// stream 複合的に利用 //map -> mapping 名前だけをマッピングして返すのでジェネリクスでStringと指定
Optional<String> oldestWomanName = People.getPeopleList().stream()
.filter(people -> people.getGender() == 2)
.max(Comparator.comparing(People::getAge))
.map(People::getName);
System.out.println("女性の中で一番年長者の名前は");
oldestWomanName.ifPresent(System.out::println);