我刚刚开始研究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)));

09-11 19:16