将泛型应用于java.util.Function

时间:2016-04-13 16:20:58

标签: java generics lambda

Function<Map<?,List>,Integer> countMap = (Map)->{
    Integer count = 0;
    for(Object key:Map.keySet()){
        count+=Map.get(key).size();
    }
    return count;
};
Integer test = countMap.apply(containedAssets);

我收到编译错误:apply(java.util.Map<?,List>> in Function cannot be applied to java.util.Map<java.util.String,List<myClass>>。这种操作是否仅仅被功能禁止?我在没有Map的情况下尝试了不同的代码,只使用了一个列表,Java可以毫无困难地获取任何类型的列表。

2 个答案:

答案 0 :(得分:8)

看起来你想要的是创建一个函数,它将返回Map<K, List<V>>中包含的所有列表大小的总和。

在这种情况下,你可以

ToIntFunction<Map<?, ? extends List<?>>> function = 
    map -> map.values().stream().mapToInt(List::size).sum();

我们可以使用ToIntFunction作为返回整数的函数,而不是Function<...,Integer>。然后,您可以使用Stream API以更简单的方式编写方法的其余部分:获取地图的值,将每个值映射到由其大小组成的IntStream并将元素加在一起。

答案 1 :(得分:5)

您已声明Function采用Map<?,List>类型List为原始的List<myClass>。但是,从您的错误消息中,您已通过Function

使用类型参数List<myClass>声明您的Function<Map<?,List<MyClass>>,Integer> countMap = (map)->{ ,即遵循正常的Java命名约定:

size()

由于只调用FunctionList并不关心? extends List<?>的类型参数,因此为了使其更灵活,您可以将其替换为Function<Map<?, ? extends List<?>>, Integer> countMap = (map)->{ },正如评论中提到的那样。

main