java 8 groupingBy,筛选大于平均值的字段的记录
尝试学习java 8 GroupingBy Country我正在尝试筛选超过平均年龄(收集)的记录(人),并返回满足此标准的人的列表 因此,SQL等价物是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(
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
吗?将姓名与年龄进行比较——很抱歉,这是个错误。我想你知道我的意思非常感谢。这正是我需要的。