Java lambda聚合器

Java lambda聚合器,java,lambda,Java,Lambda,我有一张单子 计划: ID, A_CODE, COMPARTMENT 10683 163 213 10683 616 194 10683 163 212 10683 163 211 10683 163 214 并且想要生产 综合计划 ID A_CODE COMPARTMENTS 10683 163 211/212/213/214 10683 616 194 如何使用java lambda表

我有一张单子

计划:

ID,    A_CODE, COMPARTMENT
10683   163     213 
10683   616     194
10683   163     212
10683   163     211
10683   163     214
并且想要生产 综合计划

ID      A_CODE  COMPARTMENTS
10683   163     211/212/213/214
10683   616     194
如何使用java lambda表达式实现这一点

我在想类似的事情,但不确定聚合公司部分

plans.stream()
     .collect(groupingBy(Plan::getACode, 
           aggregateCompartments(Plan::getCompartments)));
有什么建议吗?

这可能会帮助您:

    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("/")))));

如果我没弄错的话,您想要的输出是一组计划,其中每个计划的
隔间
字段从所有分组的隔间聚合而来

在这种情况下,我建议您使用
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();
然后代码可以简化如下:

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

如果您想通过
A\u code
进行挖掘:

Map<ACodeType, Set<CompartmentType>> result = plans.stream()
    .collect(Collectors.groupingBy(
        Plan::getACode, 
        Collectors.mapping(
            Plan::getCompartments, 
            Collectors.toCollection(TreeSet::new))));
Map result=plans.stream()
.collect(收集器.groupingBy(
计划:getACode,
图(
平面图:,
collection(TreeSet::new));

该系统按
A_code
进行分组,下游采集器首先将每个平面调整到其隔室,然后将每个调整后的组收集到
TreeSet
,以保持隔室分类且无重复。这需要隔室的类型具有可比性。如果不是,您需要向
树集的构造函数提供一个
比较器

请用一个更新您的问题。使用
分组方式(Plan::getACode,mapping(Plan::getbactions,join(“/”)是否有帮助?
Collection<Plan> aggregatedPlans = plans.stream()
            .collect(toMap(Plan::getACode, Plan::clone, Plan::merge)).values();
Map<ACodeType, Set<CompartmentType>> result = plans.stream()
    .collect(Collectors.groupingBy(
        Plan::getACode, 
        Collectors.mapping(
            Plan::getCompartments, 
            Collectors.toCollection(TreeSet::new))));