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());
正在尝试学习 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());