Java 8谓词泛型函数不接受整数列表

时间:2015-03-24 07:10:35

标签: java lambda java-8

我有一个使用谓词接口的过滤器方法在某些条件下过滤List。

public static <T> List<T> filter(List<T> list,Predicate<T> predicate){
    List<T> result=new ArrayList<T>();
    for(T t:list){
        if(predicate.test(t)){
            result.add(t);
        }
    }
    return result;
}

我有一个整数数组列表作为列表arraIntegerList = Arrays.asList(1,2,3,3,4);

调用上面的方法时会出现编译错误。

System.out.println(filter(arraIntegerList,(int i)->(i>2)));

为什么在使用String的相同列表工作正常时,它给出了编译错误。

2 个答案:

答案 0 :(得分:4)

您需要为List提供参数化类型,并且lambda的参数必须与List的参数匹配。

例如,这有效:

List<Integer> arraIntegerList=Arrays.asList(1,2,3,3,4);
System.out.println(filter(arraIntegerList,(Integer i)->(i>2)));

输出:

[3, 3, 4]

正如Stuart Marks评论的那样,这也有效:

List<Integer> arraIntegerList=Arrays.asList(1,2,3,3,4);
System.out.println(filter(arraIntegerList,i->(i>2)));

答案 1 :(得分:0)

lambda参数类型必须与方法描述完全匹配。由于(int i)与通用方法说明filter(List<T> list,Predicate<T> predicate)不匹配, 而且泛型不适用于原语。 所以你需要提供参数化类型。

    System.out.println(filter(arraIntegerList, (Integer i) -> (i > 2)));

然而,您可以让编译器推断出类型。在这种情况下,你可以写 -

    System.out.println(filter(arraIntegerList, i -> (i > 2)));