泛型方法mapValues(map,mapper)的签名是什么?

时间:2015-04-28 12:33:54

标签: java generics inferred-type

我编写了一个自定义CollectionUtils类来弥补Java 8中缺少某些重要的功能特性。但是,我并不精通复杂的通用性,而且我不确定是什么签名给出以下方法:

public static <K,V,N> Map<K,N> mapValues(Map<K,V> map, Function<V,N> mapper) {
    return map.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey,mapper.compose(Map.Entry::getValue)));
}

它以这种方式工作,但不是很好。例如,followind代码无法编译:

CollectionUtils.mapValues(
    candidates.stream().collect(groupingBy(x -> x.category)),
    list -> list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList()));

(错误:类别无法解析或不是字段,当然category Candidate的字段,但是编译器无法在此处推断x的类型并将其设置为Object),而这可以很好地编译:

Map<String,List<Candidate>> map = candidates.stream().collect(groupingBy(x -> x.category));
return CollectionUtils.mapValues(map,list -> list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList()));

有什么方法可以帮助编译器成功推断出地图的类型?

0 个答案:

没有答案