2017-03-16 64 views
4

也许它是变态,但我想合并内部流的结果到上面的流上。Java 8流将内部流结果合并到流上面

例如,我们有一些数据复杂的地图:

Map<String, List<Map<String, Object>>> dataMap 

,我需要收集所有对象名单。现在,我是这样做的:

Set<Object> segmentIds = new HashSet<>(); 
dataMap.values().forEach(maps -> maps.forEach(map -> segmentIds.add(map.get("object")))); 

但它不是一个漂亮的方式。但我无法理解如何将数据从内部循环传输到外部以最终收集数据。

是否有可能没有任何外部物体?

+2

我不太清楚你的输入和输出要求。你能提供[mcve]吗? – Thomas

回答

6

怎么了:

Set<Object> collect = dataMap.values() 
      .stream() 
      .flatMap(Collection::stream) 
      .map(map -> map.get("object")) 
      .collect(Collectors.toSet()); 
+0

谢谢!这正是我需要的。 – SoulCub

1

您必须使用Stream-API的flatMap

List<Object> allObjects = dataMap.values().stream() 
    .flatMap(l -> l.stream()) 
    .flatMap(m -> m.values().stream()) 
    .collect(Collectors.toList()) 

代码没有进行测试