List 在Java8流中过滤更多次
是否可以在流中过滤更多次?例如,如果我有一个ID为的列表,我想流式传输一个HashMap,并将HashMap的键映射到列表中的键,并将它们匹配的位置,我想从HashMap中获取对象并再次过滤它,例如,该对象中大于3的int字段,最后求和。例如,如果它发现了10种情况,其中列表的键和HashMap的键相等,它过滤了这10种情况,并发现了3种情况,例如一个int字段大于3,它最终会返回这些情况的总和 以下是我目前的代码: 当我尝试打印此结果的列表时,我得到以下结果: java.util.stream.ReferencePipeline$2@70177ecdList 在Java8流中过滤更多次,list,filter,java-8,hashmap,java-stream,List,Filter,Java 8,Hashmap,Java Stream,是否可以在流中过滤更多次?例如,如果我有一个ID为的列表,我想流式传输一个HashMap,并将HashMap的键映射到列表中的键,并将它们匹配的位置,我想从HashMap中获取对象并再次过滤它,例如,该对象中大于3的int字段,最后求和。例如,如果它发现了10种情况,其中列表的键和HashMap的键相等,它过滤了这10种情况,并发现了3种情况,例如一个int字段大于3,它最终会返回这些情况的总和 以下是我目前的代码: 当我尝试打印此结果的列表时,我得到以下结果: java.util.stream
somemap.entrySet().stream().filter(e -> aListContainingIds.contains(e.getKey()))
.map(Map.Entry::getValue)
.map(n -> n.getTheOtherListFromMatchedValue().stream().filter(n -> n.getAnIntFieldFromObject() > 3))
.collect(Collectors.toList());
我认为您应该使用(或Stream.flatMaptoLong
)而不仅仅是map
:
int total = somemap.entrySet().stream()
.filter(e -> aListContainingIds.contains(e.getKey()))
.map(Map.Entry::getValue)
.flatMapToInt(value -> value.getTheOtherListFromMatchedValue().stream())
.filter(n -> n.getAnIntFieldFromObject() > 3)
.sum();
通常,当应用的函数返回另一个流,并且您希望该流的元素成为原始流的一部分时,将使用flatMap
(或者flatMap
,如果流元素是某个类的实例而不是基元)
最后,您可以使用该方法得到总数。我认为您应该使用(或Stream.flatMaptoLong
)而不仅仅是map
:
int total = somemap.entrySet().stream()
.filter(e -> aListContainingIds.contains(e.getKey()))
.map(Map.Entry::getValue)
.flatMapToInt(value -> value.getTheOtherListFromMatchedValue().stream())
.filter(n -> n.getAnIntFieldFromObject() > 3)
.sum();
通常,当应用的函数返回另一个流,并且您希望该流的元素成为原始流的一部分时,将使用flatMap
(或者flatMap
,如果流元素是某个类的实例而不是基元)
最后,你可以用这个方法算出总数。为什么不试试呢?我会说:是的,有可能(熨烫一下)给我们看一些你尝试过的代码。你必须改用
过滤器
而不是映射
。也可以尝试在嵌套谓词中使用allMatch
或anyMatch
而不是filter
。或者,由于您的问题还不清楚,您可能希望使用flatMap
而不是第二个map
,在这种情况下,嵌套谓词中对filter
的调用将是正确的。也许在上一个注释之前阅读注释会有所帮助……为什么不试试呢?我会说:是的,有可能(讽刺一下)向我们展示一些您尝试过的代码。请下次使用filter
而不是map
。也可以尝试在嵌套谓词中使用allMatch
或anyMatch
而不是filter
。或者,由于您的问题还不清楚,您可能希望使用flatMap
而不是第二个map
,在这种情况下,在嵌套谓词中调用filter
是正确的。也许在上一个注释之前阅读注释会有所帮助……我认为,当您将过滤器(…)
移出flatMap
函数时,它会变得更容易阅读。没有功能上的区别,但是,flatMap
函数可以放在一行中,后续的过滤器不需要不同的缩进。@Holger很好,谢谢。但是你绝对确定即使在平行流的情况下也没有区别吗?我的意思是,不仅是功能性的,而且考虑到流如何展开,我假设将过滤器
移动到外部流会使其更有效。最值得注意的是,如果谓词是捕获lambda表达式,则在flatMap
函数中使用它将为每个外部流元素创建一个新实例,而在外部流中使用它将为整个操作创建一个谓词实例。当求和消费者与流实现中的过滤操作融合时,将假设类似的效果。我并不是说效果会很明显…@Holger谢谢,我想,当你将.filter(…)
从flatMap
功能中移出时,它会变得更容易阅读。没有功能上的区别,但是,flatMap
函数可以放在一行中,后续的过滤器不需要不同的缩进。@Holger很好,谢谢。但是你绝对确定即使在平行流的情况下也没有区别吗?我的意思是,不仅是功能性的,而且考虑到流如何展开,我假设将过滤器
移动到外部流会使其更有效。最值得注意的是,如果谓词是捕获lambda表达式,则在flatMap
函数中使用它将为每个外部流元素创建一个新实例,而在外部流中使用它将为整个操作创建一个谓词实例。当求和消费者与流实现中的过滤操作融合时,将假设类似的效果。我不是说效果会很明显…@霍尔格,谢谢