java 8 groupingBy,过滤记录大于平均值的字段

java 8 groupingBy, Filter records for fields greater than average

正在尝试学习 java 8 GroupingBy Country 我正在尝试过滤高于平均年龄(收集)的记录(人),返回满足此条件的人列表。

所以 SQL 等价于

SELECT * FROM PERSON, AVG(AGE) AS AVG_AGE
GROUPBY COUNTRY
WHERE AGE > AVG_AGE

到目前为止,这是我的尝试,只花了我一半的时间

personStream.collect(
            Collectors.groupingBy(
                    p -> p.getCountry(),
                    Collectors.averagingInt(p -> p.getAge)))

到目前为止,这只是 returns 我一个以分类器为键、按国家/地区的平均年龄为值的地图。

Chan, Japan, 40
Chong, Japan, 20
Amy, Japan, 37
James, UK, 25
Abby, UK, 15,
Jean, France 15
Pierre, France, 50

Average Japanese age = 32.33
Average UK age = 20
Average French age = 32.5

ResultSet
Chan, Japan, 40
Chong, Japan, 20
Amy, Japan, 37
James, UK, 25
Pierre, France, 50

如有任何提示,我们将不胜感激

我认为您可能需要 .filter(p -> p.getAge() > averageAge) 以某种方式从您现在获取的地图中收集 averageAge。

你将无法一次性完成。需要两遍:第一遍计算平均值,第二遍过滤年龄大于平均值的人。

请注意,您编写的 SQL 查询将不起作用 for the same reason:您不能在 WHERE 子句中引用列别名。

您的代码正确计算了居住在同一国家/地区的人的平均年龄。因此,我们需要添加过滤初始 persons 列表的代码。

Map<String, Double> map =
        persons.stream().collect(
            groupingBy(
                p -> p.getCountry(),
                averagingInt(p -> p.getAge())
            )
        );

persons.stream().filter(p -> p.getAge() > map.get(p.getCountry())).collect(toList());