従業員テーブルに対してSQLクエリを実行するとします。
SELECT department, team, MIN(salary), MAX(salary)
FROM employees
GROUP BY department, team
また、Javaクライアントでは、Aggregate
次のようにDAO呼び出しを行うことにより、結果セットをインスタンスのリストにマップします。
List<Aggregate> deptTeamAggregates = employeeDao.getMinMaxSalariesByDeptAndTeam()
また、「Aggregate」には、部門、チーム、minSalary、maxSalaryのゲッターメソッドがあり、Pair<T, T>
タプルがあります
結果セットを以下の2つのマップにマップするための、最も明確で可能な限り最適な方法は何でしょうか。
Map<String, Pair<Integer, Integer>> byDepartmentMinMax = ...
Map<Pair<String, String>, Pair<Integer, Integer>> byDepartmentAndTeamMinMax = ...
結果セットを別の方法でマッピングしたり、データベースに2回アクセスして同じことを簡単に実現したりできることはわかっていますが、Java8の機能を理解することに重点を置いています。
よろしくお願いします。
class Pair<T, U> {
public final T x;
public final U y;
public Pair(T x, U y) {
this.x = x;
this.y = y;
}
}
Collector<Aggregate, ?, Pair<Integer, Integer>> aggregateSalary =
mapping(a -> new Pair<>(a.getMinSalary(), a.getMaxSalary()),
reducing(new Pair<>(Integer.MAX_VALUE, Integer.MIN_VALUE),
(a, b) -> new Pair<>(Math.min(a.x, b.x), Math.max(a.y, b.y))));
Map<String, Pair<Integer, Integer>> byDepartmentMinMax =
deptTeamAggregates.stream()
.collect(groupingBy(a -> a.getDepartment(), aggregateSalary));
Map<Pair<String, String>, Pair<Integer, Integer>> byDepartmentAndTeamMinMax =
deptTeamAggregates.stream()
.collect(toMap(a -> new Pair<>(a.getDepartment(), a.getTeam()), a -> new Pair<>(a.getMinSalary(), a.getMaxSalary())));
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加