具有泛型的Java流

时间:2019-04-01 07:26:55

标签: java java-8 java-stream

我有一个接受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

2 个答案:

答案 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));

}