You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何构建值已排序的ImmutableListMultimap?

解决ImmutableListMultimap值排序的类型兼容问题

你的问题核心是toImmutableListMultimap的value映射器要求返回单个元素类型(这里是StatsByDimensions),但你传入的是返回ImmutableList<StatsByDimensions>的逻辑,导致类型约束冲突。以下是两种可行的替代方案:

方案一:使用ImmutableListMultimap.Builder(推荐)

直接通过Builder构建,对每个分组的值排序后批量添加,逻辑清晰且高效:

Ordering<StatsByDimensions> valueOrdering =
        Ordering.natural().onResultOf(StatsByDimensions::getCost);

// 先按维度分组
Multimap<Dimension, StatsByDimensions> groupedStats = Multimaps.index(listOfStats, StatsByDimensions::getDimension);

// 用Builder构建排序后的ImmutableListMultimap
ImmutableListMultimap.Builder<Dimension, StatsByDimensions> builder = ImmutableListMultimap.builder();
for (Map.Entry<Dimension, Collection<StatsByDimensions>> entry : groupedStats.asMap().entrySet()) {
    ImmutableList<StatsByDimensions> sortedValues = valueOrdering.immutableSortedCopy(entry.getValue());
    builder.putAll(entry.getKey(), sortedValues);
}

ImmutableListMultimap<Dimension, StatsByDimensions> statsByDimensionMap = builder.build();

方案二:基于Stream的flatMap实现

通过flatMap将排序后的分组元素展开,再用toImmutableListMultimap收集:

Ordering<StatsByDimensions> valueOrdering =
        Ordering.natural().onResultOf(StatsByDimensions::getCost);

ImmutableListMultimap<Dimension, StatsByDimensions> statsByDimensionMap =
        listOfStats.stream()
                .collect(Collectors.groupingBy(StatsByDimensions::getDimension))
                .entrySet()
                .stream()
                // 将每个分组的排序后元素转为键值对流
                .flatMap(entry -> valueOrdering.sortedCopy(entry.getValue()).stream()
                        .map(stat -> new AbstractMap.SimpleEntry<>(entry.getKey(), stat)))
                // 收集为ImmutableListMultimap
                .collect(ImmutableListMultimap.toImmutableListMultimap(
                        Map.Entry::getKey,
                        Map.Entry::getValue));

错误原因说明

ImmutableListMultimap.toImmutableListMultimap的第二个参数要求返回单个V类型元素(这里是StatsByDimensions),但你的代码中valueOrdering.immutableSortedCopy(entry.getValue())返回的是ImmutableList<StatsByDimensions>,与泛型约束的V=StatsByDimensions不匹配,因此抛出类型兼容错误。

内容的提问来源于stack exchange,提问作者Rishabh Deep Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 00:22:03