业务中碰到需要两个字段分组取值场景, 常见的两种解决方案, 第一种是直接sql语句group by分组, 第二种sream流循环嵌套
Collectors.groupingBy
进行分组, 再循环取值, 较为麻烦;
参考他人采用
org.apache.commons.lang3.tuple.Pair
类进行两字段分组取值, 代码如下:
Map<Pair<Long, BigDecimal>, Long> map = agentWriteOffGoodsList.stream() .collect(Collectors.groupingBy(p -> Pair.of(p.getCorporateUserId(), p.getPrice()), Collectors.counting())); LinkedList<Map.Entry<Pair<Long, BigDecimal>, Long>> list = new LinkedList<>(map.entrySet()); list.sort(Comparator.comparing(o -> o.getKey().getKey())); list.forEach(o -> { corporateUserIdList.add(o.getKey().getKey()); priceList.add(o.getKey().getValue()); amountList.add(o.getValue().intValue()); });
总共取出了三个数据排序后放到对应list集合, 如果取出更多值, 可以将Collectors.counting()去掉