SELECT Count(1) AS total,
'hello' AS filter,
field1 AS field1,
Count(DISTINCT field2) AS total_field2
FROM table
WHERE field = true
AND status = 'ok'
GROUP BY field1
怀疑如何使用java8制作地图以存储以下结果。映射键必须是字段field1
,映射值必须是total_field2
字段。
也就是说,我需要使用字段field1和计数字段field2对列表进行分组
对于我的总字段数
myList.stream().collect(Collectors.groupingBy(MyObject::getField1, Collectors.counting()))
// this is just counting the records grouped by field1
我的结果正确total_field1:{4 = 55,6 = 31}
对于field2,我需要这样的东西,但这只是给我一个记录
myList.stream().filter(distinctByKey(MyObject::getField2))
.collect(Collectors.groupingBy(MyObject::getField1, Collectors.counting()));
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Set<Object> seen = ConcurrentHashMap.newKeySet();
return t -> seen.add(keyExtractor.apply(t));
}
结果total_Field2:{4 = 31}
应该给我2条示例记录total_Field2:{4 = 31,6 = 31}
实际上,我使用Set
消除重复项,并使用Collectors.collectingAndThen
得出尺寸
Map<String, Integer> res = list.stream()
.collect(Collectors.groupingBy(MyObject::getField1,
Collectors.mapping(MyObject::getField2,
Collectors.collectingAndThen(Collectors.toSet(), set->set.size()))));
根据@Naman的建议,您也可以使用方法参考Set::size
Collectors.collectingAndThen(Collectors.toSet(), Set::size))));