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