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