Java 8流比较两个对象并对它们运行一个函数

时间:2017-03-30 12:47:02

标签: java-8 java-stream

我想要根据匹配的ID分割成较小的部分,然后在每个部分/元素上应用一些处理逻辑。

class BigRequest{
String bId;
List<Parts> parts;
//getters and setter here
}

Class Parts{
String pId;
String partId;
//getters and setter here
}

当不同部分的partId相同时,我想隔离并创建一个大小为10的部件列表。

如何使用filter或reduce或groupingBy函数来比较这两个元素并将它们放到列表中? 我已经尝试了如下所示的过滤器,没有采用p1变量:

big.stream().filter( p -> p.getPartId() == p1.getPartId()) //error

尝试分组,就像这样

big.stream().collect(Collectors.groupingBy(Parts::getPartId) //error

我想迭代过滤/缩减列表另一个并调用另一个名为abc()的函数。我怎么能用Java Streams做到这一点?

伪:

big.getParts().stream.
//dividing logic logic
for(i < parts.size)
    abc(p)

由于

1 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

 Map<String,List<Parts>> commonId = big.getParts().
                stream().
                collect(
                        Collectors.groupingBy(
                            Parts::getPartId,
                            Collectors.mapping(
                                Function.identity(),
                                Collectors.toList()
                            )
                        )
                ); 

之后,您只需要迭代地图并应用您的功能。  commonId.entrySet().stream().map(entry -> apply(entry))...

<强>更新 我们可以省略Collectors.mapping(Function.identity(),Collectors.toList())部分,因为它是groupingBy

的默认行为
Map<String,List<Parts>> commonId = big.getParts().
                    stream().
                    collect(
                            Collectors.groupingBy(
                                Parts::getPartId
                            )
                    );