如何构建值已排序的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
相关产品推荐
相关产品推荐

