3 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個贊
雖然你的嘗試沒有成功,但我覺得是你最想表達(dá)的。所以我只是按照你的代碼并修復(fù)它。試試這個!
Map<LocalDate,?ImmutablePair<Integer,?Map<String,?Long>>>?map?=?revenueRecords.stream() ????????????.collect(groupingBy(RevenueRecorder::getReportDate, ????????????????????collectingAndThen(toList(),?list?->?new?ImmutablePair(list.stream().collect(summingInt(RevenueRecorder::getRevenue)), ??????????????????????????????????????????????????????????????????????????list.stream().collect(groupingBy(RevenueRecorder::getClientCode,?Collectors.counting()))))));
結(jié)果如下
這是我自己的想法,希望能幫到你。╰( ̄▽ ̄)╭

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個贊
如果您已經(jīng)使用 Java 12,則有一個新的收集器Collectors.teeing(),它允許使用兩個獨(dú)立的收集器進(jìn)行收集,然后使用提供的 BiFunction 合并它們的結(jié)果。傳遞到結(jié)果收集器的每個元素都由兩個下游收集器處理,然后使用指定的合并函數(shù)將它們的結(jié)果合并到最終結(jié)果中。因此Collectors.teeing()可能很適合,因?yàn)槟胍嫈?shù)和求和。
Map<LocalDate, Result> pairedReportDateMRR =
revenueRecords.stream().collect(Collectors.groupingBy(RevenueRecorder::getReportDate,
Collectors.teeing(Collectors.counting(),
Collectors.summingInt(RevenueRecorder::getRevenue), Result::new)));
System.out.println(pairedReportDateMRR);
//output: {2019-01-07={count=2, sum=46}, 2019-01-16={count=3, sum=224}}
出于測試目的,我使用了以下簡單的靜態(tài)類
static class Result {
private Long count;
private Integer sum;
public Result(Long count, Integer sum) {
this.count = count;
this.sum = sum;
}
@Override
public String toString() {
return "{" + "count=" + count + ", sum=" + sum + '}';
}
}

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個贊
首先,Map<LocalDate, Pair<Integer, Integer>>由于您想進(jìn)行第二次分組,您無法制作地圖,這意味著對于同一日期,您可能有多個客戶代碼,每個客戶代碼都有單獨(dú)的計數(shù)器。
所以如果我沒猜錯你就不會得到這樣的東西Map<LocalDate, MutablePair<Integer, Map<String, Integer>>>,如果它是正確的試試這個代碼片段:
public static void main(String[] args) {
String data = "C1,2019-1-7,12\n" +
"C2,2019-1-7,34\n" +
"C1,2019-1-16,56\n" +
"C2,2019-1-16,78\n" +
"C3,2019-1-16,90";
Stream.of(data.split("\n")).forEach(System.out::println);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-M-d");
List<RevenueRecorder> revenueRecords = Stream.of(data.split("\n")).map(line -> {
String[] s = line.split(",");
String clientCode = s[0];
LocalDate reportDate = LocalDate.parse(s[1].trim(), formatter);
int revenue = Integer.parseInt(s[2]);
return new RevenueRecorder(clientCode, reportDate, revenue);
}).collect(toList());
Supplier<MutablePair<Integer, Map<String, Integer>>> supplier = () -> MutablePair.of(0, new HashMap<>());
BiConsumer<MutablePair<Integer, Map<String, Integer>>, RevenueRecorder> accumulator = (pair, recorder) -> {
pair.setLeft(pair.getLeft() + recorder.getRevenue());
pair.getRight().merge(recorder.getClientCode(), 1, Integer::sum);
};
BinaryOperator<MutablePair<Integer, Map<String, Integer>>> combiner = (p1, p2) -> {
p1.setLeft(p1.getLeft() + p2.getLeft());
p2.getRight().forEach((key, val) -> p1.getRight().merge(key, val, Integer::sum));
return p1;
};
Map<LocalDate, MutablePair<Integer, Map<String, Integer>>> pairedReportDateMRR = revenueRecords.stream()
.collect(
groupingBy(RevenueRecorder::getReportDate,
Collector.of(supplier, accumulator, combiner))
);
System.out.println(pairedReportDateMRR);
}
添加回答
舉報