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))));