我有一个接受Function<? extends T, ? extends K> classifier
的泛型函数。
我也过去了:
T
,它将每个项K
映射到键Function<? extends T, Integer> evaluator
(可能有重复项)
int to int
给出了项目的整数值。
对于每个产生的Integer
,函数本身都有一个内置计算(“ Map<K, Integer>
”)(对于我们的示例,可能像平方一样)
最后,我想对每个键的所有值求和。
所以最终结果是:["a","a", "bb"]
。
例如,
假设我们有列表Function.identity
,我们使用String::length
进行分类,{"a": 2, "b": 4}
进行评估和平方作为内置函数。然后返回的地图将是:Collectors.groupingBy
我该怎么做? (我想最好使用head
)
答案 0 :(得分:4)
这里是一种方法:
public static <T,K> Map<K,Integer> mapper (
Collection<T> ts,
Function<T, K> classifier,
Function<T, Integer> evaluator,
Function<Integer,Integer> calculator)
{
return
ts.stream()
.collect(Collectors.groupingBy(classifier,
Collectors.summingInt(t->evaluator.andThen(calculator).apply(t))));
}
以下输出:
System.out.println (mapper(Arrays.asList("a","a","bb"),Function.identity(),String::length,i->i*i));
是
{bb=4, a=2}
答案 1 :(得分:2)
或另一种方法:
private static <K, T> Map<K, Integer> map(Collection<? extends T> ts,
Function<? super T, ? extends K> classifier,
Function<? super T, Integer> evaluator,
Function<Integer, Integer> andThen) {
return ts.stream()
.collect(Collectors.groupingBy(
classifier,
Collectors.mapping(evaluator.andThen(andThen),
Collectors.reducing(0, Integer::sum))
));
}
并用于:
public static void main(String[] args) {
System.out.println(map(
Arrays.asList("a", "a", "bb"),
Function.identity(),
String::length,
x -> x * x));
}