L-S*_*els 4 java group-by aggregate-functions java-8
试图学习java 8 GroupingBy国家我正在尝试过滤高于平均年龄的记录(人)(收集)返回满足此标准的人员列表.
所以SQL的等价物是
SELECT * FROM PERSON, AVG(AGE) AS AVG_AGE
GROUPBY COUNTRY
WHERE AGE > AVG_AGE
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是我的尝试,只让我走了一半
personStream.collect(
Collectors.groupingBy(
p -> p.getCountry(),
Collectors.averagingInt(p -> p.getAge)))
Run Code Online (Sandbox Code Playgroud)
到目前为止,这只返回一个以分类器为关键字的Map和按国家/地区的平均年龄值.
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
Run Code Online (Sandbox Code Playgroud)
任何提示将不胜感激
你将无法一次性完成.需要2次传递:第一次计算平均值,第二次过滤年龄大于平均值的人.
请注意,您编写的SQL查询不会出于同样的原因:您无法在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());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3654 次 |
| 最近记录: |