将泛型应用于java.util.Function

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可以毫无困难地使用任何类型的列表.

Tun*_*aki 8

它看起来你想要的是创建一个函数,它将返回包含在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由其大小组成的值并将元素加在一起.


rge*_*man 5

你宣布你FunctionMap<?,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)

  • 还是`?如果类型未知,则扩展List <?>`. (2认同)