java 8流展开或发出列表以获取单个值

时间:2014-10-03 12:05:11

标签: java lambda java-8

我有这样的地图:

 Map<String, List<String>> map

现在我想从地图值中获取所有列表条目,并将它们用作另一个地图中的键。

Map<String, String> newMap = map.entrySet()
  .stream()
  .fiter(somefilter -> true)
  .collect(Collectors.toMap(
      k -> k.getValue(), // I want to have every single value as key
      v -> v.getKey());

有没有办法在Java 8流中“展开”数组?在MongoDB中,我会写这样的东西:

Map<String, String> newMap = map.entrySet()
  .stream()
  .fiter(somefilter -> true)
  .unwind(entry -> entry.getValue())
  .collect(Collectors.toMap(
      k -> k.getValue(), 
      v -> v.getKey());

1 个答案:

答案 0 :(得分:6)

一种方法是创建值/键对的流(例如,使用数组)并将它们平面映射以供收集:

 Map<String, String> newMap = map.entrySet().stream()
         .flatMap(e -> e.getValue().stream().map(s -> new String[] { s, e.getKey() }))
         .collect(toMap(array -> array[0], array -> array[1]));

虽然字符串数组看起来有点hacky ......