Guava中有什么东西允许我将Multimap的反转作为(非多)地图吗?
请考虑以下事项:
inverse()
问题是malloc
再次是Multimap,而不是Map。在Guava中有什么东西可以为我进行转换,还是我必须自己编写实用函数?
答案 0 :(得分:4)
我能想到的最好的方法是使用map view of a multimap和Maps.transformValues
视图(我假设Java 8在这里,否则使用Function
代替方法参考):
static final ImmutableMap<Token, Integer> PRECEDENCES = ImmutableMap.copyOf(
Maps.transformValues(TOKENS.inverse().asMap(), Iterables::getOnlyElement));
使用Java 8流,上面将是:
static final Map<Token, Integer> PRECEDENCES =
TOKENS.inverse().asMap().entrySet().stream()
.collect(Collectors.collectingAndThen(
Collectors.toMap(
Map.Entry::getKey,
e -> Iterables.getOnlyElement(e.getValue())),
ImmutableMap::copyOf));
或者如果您关心订单:
static final ImmutableMap<Token, Integer> PRECEDENCES =
TOKENS.inverse().asMap().entrySet().stream()
.collect(Collectors.collectingAndThen(
Collectors.toMap(
Map.Entry::getKey,
e -> Iterables.getOnlyElement(e.getValue()),
(u, v) -> {
throw new IllegalStateException(String.format("Duplicate key %s", u));
},
LinkedHashMap::new),
ImmutableMap::copyOf));
或希望在番石榴21:
static final Map<Token, Integer> PRECEDENCES =
TOKENS.inverse().asMap().entrySet().stream()
.collect(ImmutableMap.toImmutableMap(
Map.Entry::getKey,
e -> Iterables.getOnlyElement(e.getValue())));