繁体   English   中英

Java 8流分组的最小值和最大值

[英]Java 8 stream group by min and max

假设您对一个employees表运行一个SQL查询:

SELECT department, team, MIN(salary), MAX(salary)
  FROM employees
 GROUP BY department, team

然后在Java客户端中,通过进行如下所示的DAO调用,将结果集映射到Aggregate实例列表:

List<Aggregate> deptTeamAggregates = employeeDao.getMinMaxSalariesByDeptAndTeam()

并且“集合”具有部门,团队,minSalary,maxSalary的吸气方法,并且有一个Pair<T, T>元组

将结果集映射到下面的两个映射中,最清晰,可能也是最佳的方法是:

Map<String, Pair<Integer, Integer>> byDepartmentMinMax = ...
Map<Pair<String, String>, Pair<Integer, Integer>> byDepartmentAndTeamMinMax  = ...

我知道我可以用不同的方式映射结果集和/或两次访问数据库并以更简单的方式实现相同的目的,但是我更多的是了解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())));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM