这是此问题Java 8 stream compare two objects and run a function on them
的延续Class BigRequest{
String bId;
List<Parts> parts;
//getters and setter here
}
Class Parts{
String pId;
String partId;
//getters and setter here
}
我的问题是根据一些动态参数将Collection(使用java 8流)拆分为更小的组件。 动态参数可以根据传递给方法splitParts的不同条件(这里,我给出的例子,因为getPartId()是相同的)来改变,其返回类型是List of Parts of Parts
List<Set<Parts>> splitParts(BigRequest big){}
我尝试了以下内容:
//groupingBy function but that returns a Map
Map<String, List<Parts>> parts = big.getParts().stream().collect(Collectors.groupingBy(Parts::getPartId));
//doesn't do it accurately
big.getParts().stream().filter(p -> p.getPartId.equals(p.getPartId())).collect();
如何基于动态参数拆分流(可能通过调用reduce方法的函数接口),然后在其上运行方法?
我的功能签名是
List<Set<Parts>> splitParts(BigObject b){}
我认为做这样的事情可能有助于保持分裂条件的动态,但我不知道该怎么做?
big.getParts().stream().reduce(MyFuncInterface::divide);
然后使用forEach(),我想我可以迭代List并调用abc()方法。
我怎样才能做得更好?
非常感谢任何帮助。
答案 0 :(得分:4)
如果您需要List<Set<Parts>>
,请先更改代码以获取Map<String, Set<Parts>>
:
Map<String, Set<Parts>> parts = big.getParts().stream().collect(
Collectors.groupingBy(Parts::getPartId, Collectors.toSet()));
致电parts.values()
将返回Collection<Set<Parts>>
,因此将Collection
转换为List
:
List<Set<Parts>> list = new ArrayList<>(parts.values());
或者您可以重新流式传输它,因此您可以在一个调用链中执行此操作:
List<Set<Parts>> list = big.getParts()
.stream()
.collect(Collectors.groupingBy(Parts::getPartId,
Collectors.toSet()))
.values()
.stream()
.collect(Collectors.toList());