【问题标题】:Java 8 stream compare two objects and run a function on themJava 8 流比较两个对象并在它们上运行一个函数
【发布时间】:2017-08-24 09:44:41
【问题描述】:

我有一个流,我想根据匹配的 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

这样尝试过groupingBy

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

我想遍历另一个过滤/简化列表并调用另一个名为 abc() 的函数。如何使用 Java Streams 做到这一点?

伪:

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

谢谢

【问题讨论】:

  • 你的错误是因为你有一个BigRequest 的列表,但你在上面调用Parts::getPartId,这与调用BigRequest.getPartId() 相同(不起作用)。你必须flatMap(bigParts -&gt; bigParts.parts.stream())然后它会允许你使用Parts::getPartId
  • 然而,通常不可能通过将Stream&lt;T&gt; 收集到某种Stream&lt;List&lt;T&gt;&gt; 中来在流中创建背压 - 流是通过设计操作一次仅对单个元素进行的。您可以将Stream&lt;List&lt;T&gt;&gt; 解包为Stream&lt;T&gt;,但您无法使用相反的方法。

标签: java-8 java-stream


【解决方案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 -&gt; apply(entry))...

更新 我们可以省略Collectors.mapping(Function.identity(),Collectors.toList()) 部分,因为它是groupingBy 的默认行为

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

【讨论】:

  • 正常的groupingBy收集器已经是mapping(identity(), toList())了,不是吗?
  • @M.Prokhorov,是的,你完全正确。我们不需要 - Collectors.mapping(Function.identity(),Collectors.toList()) 部分
  • @M. Prokhorov:嗯,groupingBy 默认使用toList()mapping(identity(), …) 更加多余。
  • @Holger,老实说,我一直在使用Collectors.mapping(Function.identity(),Collectors.toList()),我从来不知道toList()groupingBy 的默认行为。多可惜!我现在会更仔细地阅读 java 文档。
  • 但是将收集器包装成mapping(identity(), …)收集器的目的是什么?
猜你喜欢
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
相关资源
最近更新 更多