Java 8 个流组(按最小值和最大值)
Java 8 stream group by min and max
假设您 运行 一个针对雇员 table 的 SQL 查询:
SELECT department, team, MIN(salary), MAX(salary)
FROM employees
GROUP BY department, team
并且在 java 客户端中,您通过如下所示的 DAO 调用将结果集映射到 Aggregate
个实例的列表:
List<Aggregate> deptTeamAggregates = employeeDao.getMinMaxSalariesByDeptAndTeam()
并且 'Aggregate' 有 getter 方法用于部门、团队、minSalary、maxSalary 并且有一个 Pair<T, T>
元组
将结果集映射到下面两个图中的最清晰和可能的最佳方式是什么:
Map<String, Pair<Integer, Integer>> byDepartmentMinMax = ...
Map<Pair<String, String>, Pair<Integer, Integer>> byDepartmentAndTeamMinMax = ...
我知道我可以用不同的方式映射我的结果集 and/or 两次访问数据库并以更简单的方式实现相同的事情,但我更想了解 java 8能力。
提前感谢您的意见。
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())));
假设您 运行 一个针对雇员 table 的 SQL 查询:
SELECT department, team, MIN(salary), MAX(salary)
FROM employees
GROUP BY department, team
并且在 java 客户端中,您通过如下所示的 DAO 调用将结果集映射到 Aggregate
个实例的列表:
List<Aggregate> deptTeamAggregates = employeeDao.getMinMaxSalariesByDeptAndTeam()
并且 'Aggregate' 有 getter 方法用于部门、团队、minSalary、maxSalary 并且有一个 Pair<T, T>
元组
将结果集映射到下面两个图中的最清晰和可能的最佳方式是什么:
Map<String, Pair<Integer, Integer>> byDepartmentMinMax = ...
Map<Pair<String, String>, Pair<Integer, Integer>> byDepartmentAndTeamMinMax = ...
我知道我可以用不同的方式映射我的结果集 and/or 两次访问数据库并以更简单的方式实现相同的事情,但我更想了解 java 8能力。
提前感谢您的意见。
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())));