为了账号安全,请及时绑定邮箱和手机立即绑定

带有泛型的 Java 流

带有泛型的 Java 流

斯蒂芬大帝 2022-09-14 09:43:13
我有一个接受 的泛型函数。Collection<? extends T> ts我也通过了:Function<? extends T, ? extends K> classifier将每个项目映射到一个键(可能有重复项)TKFunction<? extends T, Integer> evaluator它为项目提供一个整数值。该函数本身对每个生成都有一个内置的计算(“”)(对于我们的示例,可以像平方一样)int to intInteger最后,我想对每个键的所有值求和。所以最终结果是:.Map<K, Integer>例如,假设我们有一个列表,我们用它来分类、评估和平方作为内置函数。然后返回的地图将是:["a","a", "bb"]Function.identityString::length{"a": 2, "b": 4}我该怎么做?(我想最好使用Collectors.groupingBy)
查看完整描述

2 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超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}


查看完整回答
反对 回复 2022-09-14
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

或者另一种方法:


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


}


查看完整回答
反对 回复 2022-09-14
  • 2 回答
  • 0 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信