我编写了一个自定义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()));
有什么方法可以帮助编译器成功推断出地图的类型?