Har*_*eyV 3 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);
Run Code Online (Sandbox Code Playgroud)
我得到编译器错误:apply(java.util.Map<?,List>> in Function cannot be applied to java.util.Map<java.util.String,List<myClass>>.这种操作是否仅仅被功能禁止?我在没有Map的情况下尝试了不同的代码,只使用了一个列表,Java可以毫无困难地使用任何类型的列表.
它看起来你想要的是创建一个函数,它将返回包含在a中的所有列表大小的总和Map<K, List<V>>.
在那种情况下,你可以拥有
ToIntFunction<Map<?, ? extends List<?>>> function =
map -> map.values().stream().mapToInt(List::size).sum();
Run Code Online (Sandbox Code Playgroud)
我们可以使用ToIntFunction函数作为返回整数的函数,而不是Function<...,Integer>.然后,您可以使用Stream API以更简单的方式编写方法的其余部分:获取地图的值,将每个值映射到IntStream由其大小组成的值并将元素加在一起.
你宣布你Function拿Map<?,List>其中类型List是生吃.但是,从您的错误消息中,您已通过了List<myClass>.
Function使用type参数声明你的List<myClass>,即遵循普通的Java命名约定:
Function<Map<?,List<MyClass>>,Integer> countMap = (map)->{
Run Code Online (Sandbox Code Playgroud)
因为只是size()被调用,所以Function不关心什么类型的参数List,所以为了使它更灵活,你可以用? extends List<?>注释中提到的替换它.
Function<Map<?, ? extends List<?>>, Integer> countMap = (map)->{
Run Code Online (Sandbox Code Playgroud)