根据不同的参数将集合(使用java 8流)拆分为更小的组件

时间:2017-04-04 05:59:09

标签: java java-8 java-stream

这是此问题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()方法。

我怎样才能做得更好?

非常感谢任何帮助。

1 个答案:

答案 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());