java 8通过不同计数分组

问题描述 投票:2回答:1
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}

java java-8 java-stream grouping collectors
1个回答
1
投票

实际上,我使用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))));
© www.soinside.com 2019 - 2024. All rights reserved.