Javaエンジニア養成読本 - 6日目

年収が800万以上の社員のリスト
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class SampleClass {
    public static void main(String... args) {
        List<Emp> emps = new ArrayList<>();
        for (int i = 3; i <= 12; i++) {
            emps.add(new Emp(i * 100));
        }

        empsOfHighIncome1(emps)
            .forEach(emp -> System.out.println(emp.getIncome()));

        empsOfHighIncome2(emps)
            .forEach(emp -> System.out.println(emp.getIncome()));
    }

    public static List<Emp> empsOfHighIncome1(List<Emp> emps) {
        return emps.stream()
            .filter(emp -> emp.getIncome() >= 800)
            .collect(ArrayList::new, List::add, List::addAll);
    }

    public static List<Emp> empsOfHighIncome2(List<Emp> emps) {
        return emps.stream()
            .filter(emp -> emp.getIncome() >= 800)
            .collect(Collectors.toList());
    }
}

class Emp {
    int income;

    Emp(int income) {
        this.income = income;
    }

    int getIncome() { return income; }
}
学生の配列から各要素の名前を取り出して文字列表記にする

lombokも使ってみた。

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;
import java.util.stream.Collectors;

public class SampleClass {
    public static void main(String... args) {
        Student[] students = {
            new Student("A"),
            new Student("B"),
            new Student("C")
        };

        System.out.println(toStringByName(students));
    }

    public static String toStringByName(Student[] students) {
        return Arrays.stream(students)
            .map(Student::getName)
            .collect(Collectors.joining(", ", "[", "]"));
    }
}

@Getter
@AllArgsConstructor
class Student {
    private String name;
}
部署別の社員のリストに変換する、並列実行
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class SampleClass {
    public static void main(String... args) {
        Dep dep1 = new Dep();
        Dep dep2 = new Dep();
        List<Emp> emps = Arrays.asList(
            new Emp("A", dep1),
            new Emp("B", dep2),
            new Emp("C", dep1),
            new Emp("D", dep2)
        );

        Map<Dep, List<Emp>> map1 = empsByDep1(emps);
        Map<Dep, List<Emp>> map2 = empsByDep1(emps);

        map1.get(dep1).stream().map(Emp::getName).forEach(System.out::println);
        map2.get(dep2).forEach(emp -> System.out.println(emp.getName()));
    }

    public static Map<Dep, List<Emp>> empsByDep1(List<Emp> emps) {
        return emps.stream()
            .collect(Collectors.groupingBy(emp -> emp.getDep()));
    }

    public static Map<Dep, List<Emp>> empsByDep2(List<Emp> emps) {
        return emps.parallelStream()
            .collect(Collectors.groupingByConcurrent(Emp::getDep));
    }
}

@Getter
@AllArgsConstructor
class Emp {
    private String name;
    private Dep dep;
}

class Dep { }

今日の感想

メソッド参照で書くかどうかはどちらがすっきりするかで選択すればよいのだろうか。
並列実行は使用するメソッドと、使いどころを間違えないようにする。