Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java 8 groupingBy,筛选大于平均值的字段的记录_Java_Group By_Java 8_Aggregate Functions - Fatal编程技术网

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

java 8 groupingBy,筛选大于平均值的字段的记录,java,group-by,java-8,aggregate-functions,Java,Group By,Java 8,Aggregate Functions,尝试学习java 8 GroupingBy Country我正在尝试筛选超过平均年龄(收集)的记录(人),并返回满足此标准的人的列表 因此,SQL等价物是 SELECT * FROM PERSON, AVG(AGE) AS AVG_AGE GROUPBY COUNTRY WHERE AGE > AVG_AGE 这是我迄今为止的尝试,只花了我一半的时间 personStream.collect( Collectors.groupingBy(

尝试学习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)))
到目前为止,这只返回一个以分类器为键、以国家平均年龄为值的地图

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

任何提示都将不胜感激。

我想你可能需要。过滤(p->p.getAge()>averageAge)以某种方式从你现在获得的地图中收集平均值。

你不可能一次就做到这一点。必须通过两次:第一次是计算平均值,第二次是过滤年龄大于平均值的人

请注意,您编写的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());
地图=
persons.stream().collect(
分组依据(
p->p.getCountry(),
平均值(p->p.getAge())
)
);
persons.stream().filter(p->p.getAge()>map.get(p.getCountry()).collect(toList());

我认为您必须重复该列表两次——一次来计算每个国家的平均年龄(正如您已经做的那样),第二次应用筛选器时,使用第一步中生成的映射确定一个人的年龄是否高于平均年龄。在SQL中,应使用HAVING子句按结果筛选组。正如@Tagir Valeev所述,当您在条件中引用聚合值时,您很可能希望
拥有
而不是
WHERE
,但是,wtf应该是
WHERE NAME>AVG_AGE
吗?将姓名与年龄进行比较——很抱歉,这是个错误。我想你知道我的意思非常感谢。这正是我需要的。