java 8 groupingBy,筛选大于平均值的字段的记录

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)

任何提示将不胜感激

Tun*_*aki 6

你将无法一次性完成.需要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)