Java-8:Stream 如何将 Map<K, List<D>> 转换为 Map<D, List<K>>

标签 java java-8 java-stream

我刚刚开始研究 Java 8 并尝试 lambda,我有一个针对上述问题的用例,我正在使用通常的 for 循环来解决该问题,该循环非常冗长且难以阅读

我现有的代码

private static Map<DataType, List<OperatorType>> buildmap() {

    Map<DataType, List<OperatorType>> map = Maps.newHashMap();

    for (OperatorType type : OperatorType.values()) {
        List<DataType> supportedTypes = type.getSupportedtypes();
        supportedTypes.forEach(datatype -> {
            if (map.containsKey(datatype)) {
                List<OperatorType> list = map.get(datatype);
                list.add(type);
                map.put(datatype,
                        list);
            } else {
                map.put(datatype,
                        new ArrayList<OperatorType>() {
                            private static final long serialVersionUID = 1L;

                            {
                                add(type);
                            }
                        });
            }
        });
    }

    return Collections.unmodifiableMap(new LinkedHashMap<>(map));
}

最佳答案

也许这样的事情有帮助:

<D, K> Map<D, List<K>> swap(Map<K, List<D>> map) {
  return map.entrySet().stream()
                       .flatMap(e -> e.getValue().stream()
                                                 .map(v -> new SimpleEntry<>(v, e.getKey())))
     .collect(Collectors.groupingBy(Entry::getKey, 
                                    Collectors.mapping(Entry::getValue,
                                                       Collectors.toList())));
}

流并不总是解决所有类型问题的最简单的解决方案。请参阅@Flown's answer以获得更容易理解和更简单的非流解决方案。

您可以使用 .forEach 将 Flown 的答案写成“类似流”,但它并没有真正变得更具可读性(假设 values()getSupportedTypes() 都返回一个 List),我不会推荐它只是说您正在使用流:

OperatorType.values()
  .forEach(type -> type.getSupportedTypes()
    .forEach(dataType -> map.computeIfAbsent(dataType, dt -> new ArrayList<>())
                                                .add(type)));

关于Java-8:Stream 如何将 Map<K, List<D>> 转换为 Map<D, List<K>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43718794/

相关文章:

java - 构建无法解决 Objectify 依赖关系

java - 帮助了解 String.substring(int, int) 的工作原理

java - 如何避免连字符拆分正则表达式?

Java 8 foreach 将子对象添加到新列表

java - 并行流哈希集

java - 自动添加数组的行

java - 如何从Function接口(interface)返回Consumer

安装 Java 8 后,Java 插件不会出现在 Firefox 中

java - 如何从 LongStream 创建 map

java - 使用 reduce 和 collect 求平均值