List 在Java8流中过滤更多次

List 在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

是否可以在流中过滤更多次?例如,如果我有一个ID为的列表,我想流式传输一个HashMap,并将HashMap的键映射到列表中的键,并将它们匹配的位置,我想从HashMap中获取对象并再次过滤它,例如,该对象中大于3的int字段,最后求和。例如,如果它发现了10种情况,其中列表的键和HashMap的键相等,它过滤了这10种情况,并发现了3种情况,例如一个int字段大于3,它最终会返回这些情况的总和

以下是我目前的代码: 当我尝试打印此结果的列表时,我得到以下结果: java.util.stream.ReferencePipeline$2@70177ecd

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
函数中使用它将为每个外部流元素创建一个新实例,而在外部流中使用它将为整个操作创建一个谓词实例。当求和消费者与流实现中的过滤操作融合时,将假设类似的效果。我不是说效果会很明显…@霍尔格,谢谢