具有泛型的Java流

yas*_*eco 5 java java-8 java-stream

我有一个接受的泛型函数Collection<? extends T> ts

我也通过了:

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

Era*_*ran 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))));
}
Run Code Online (Sandbox Code Playgroud)

输出为:

System.out.println (mapper(Arrays.asList("a","a","bb"),Function.identity(),String::length,i->i*i));
Run Code Online (Sandbox Code Playgroud)

{bb=4, a=2}
Run Code Online (Sandbox Code Playgroud)

  • `t-&gt;evaluator.andThen(calculator).apply(t)` 将重复调用 `andThen`,为该 lambda 表达式的每次计算构造一个新的 `Function` 实例。将一个方法应用于另一个方法的结果的直接方法是嵌套调用,如“t -&gt; Calculator.apply(evaluator.apply(t))”。或者,如果它确实必须是一个新的函数构造,则“evaluator.andThen(calculator)::apply”将仅调用“andThen”一次并捕获结果。 (4认同)