Java lambda聚合器

时间:2018-02-15 05:36:32

标签: java lambda

我有一个清单

PLANS:

ID,    A_CODE, COMPARTMENT
10683   163     213 
10683   616     194
10683   163     212
10683   163     211
10683   163     214

并希望生产 AGGREGATED_PLANS

ID      A_CODE  COMPARTMENTS
10683   163     211/212/213/214
10683   616     194

如何使用java lambda表达式执行此操作?

我在想这样的事情,但不确定aggregateCompartments部分?

plans.stream()
     .collect(groupingBy(Plan::getACode, 
           aggregateCompartments(Plan::getCompartments)));

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

这可能会对您有所帮助:

    List<Plan> plans = new ArrayList<>();
    plans.add(new Plan("10683", "163", "213"));
    plans.add(new Plan("10683", "616", "194"));
    plans.add(new Plan("10683", "163", "212"));
    plans.add(new Plan("10683", "163", "211"));
    plans.add(new Plan("10683", "163", "214"));

    System.out.println(
        plans.stream().collect(
               Collectors.groupingBy(p -> p.id + " " + p.aCode, 
               Collectors.mapping(Plan::getCompartment, Collectors.joining("/")))));

输出:

{10683 616=194, 10683 163=213/212/211/214}

答案 1 :(得分:1)

如果我说得对,那么您想要的输出就是一系列计划,其中每个计划的toMap字段都是从所有分组的区域聚合而来。

在这种情况下,我建议你使用一个mergeFunction收集器,它有一个特殊的Collection<Plan> aggregatedPlans = plans .stream() .collect(toMap( Plan::getACode, p -> new Plan(p.getId(), p.getACode(), p.getCompartment()), (p1, p2) -> { p1.compartment += "/" + p2.compartment; return p1; })) .values(); 参数:

Plan

如果您将以下两种方法添加到public Plan clone() { return new Plan(id, aCode, compartment); } public Plan merge(Plan other) { compartment += "/" + other.compartment; return this; } 对象

Collection<Plan> aggregatedPlans = plans.stream()
            .collect(toMap(Plan::getACode, Plan::clone, Plan::merge)).values();

然后代码可以像这样简化:

woocommerce/includes/class-wc-discounts.php

答案 2 :(得分:0)

如果你想通过A_CODE grupo:

Map<ACodeType, Set<CompartmentType>> result = plans.stream()
    .collect(Collectors.groupingBy(
        Plan::getACode, 
        Collectors.mapping(
            Plan::getCompartments, 
            Collectors.toCollection(TreeSet::new))));

A_CODE进行分组,下游收集器首先将每个计划调整到其隔离区,然后将每个适应的组收集到TreeSet,以保持隔离区的排序且不重复。这需要隔离专区的类型为Comparable。如果不是,您需要向Comparator的构造函数提供TreeSet