【发布时间】:2019-10-12 18:41:52
【问题描述】:
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}
示例 @Naman
public static <T, A, R> Collector<T, ?, R> filtering(
Predicate<? super T> predicate, Collector<? super T, A, R> downstream) {
BiConsumer<A, ? super T> accumulator = downstream.accumulator();
return Collector.of(downstream.supplier(),
(r, t) -> { if(predicate.test(t)) accumulator.accept(r, t); },
downstream.combiner(), downstream.finisher(),
downstream.characteristics().toArray(new Collector.Characteristics[0]));
}
myList.stream().collect(Collectors.groupingBy(MyObject::getField1, filtering(distinctByKey(MyObject::getField2), Collectors.counting())));
【问题讨论】:
-
你忘了问问题。
-
请记住How to Ask
-
如果我知道你想按
field1分组,field2的不同计数是对的吗? -
@Deadpool,这就是我想要完成的,但我没有得到
-
@JoSSte 抱歉,我会改进一个问题
标签: java java-8 java-stream grouping collectors