我有一个清单
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)));
有什么建议吗?
答案 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
。