Multimap.inverse()到(非多)Map(已知原始地图中的值是唯一的)

时间:2016-11-04 21:18:53

标签: java guava multimap

Guava中有什么东西允许我将Multimap的反转作为(非多)地图吗?

请考虑以下事项:

inverse()

问题是malloc再次是Multimap,而不是Map。在Guava中有什么东西可以为我进行转换,还是我必须自己编写实用函数?

1 个答案:

答案 0 :(得分:4)

我能想到的最好的方法是使用map view of a multimapMaps.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())));