【问题标题】:Java 8 predicate generic function is not accepting List of IntegersJava 8 谓词泛型函数不接受整数列表
【发布时间】:2015-03-24 07:10:35
【问题描述】:

我有一种过滤方法,使用谓词接口在某些条件下过滤列表。

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

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

调用上述方法时出现编译错误。

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

为什么它给出了编译错误,而与 String 相同的列表工作正常。

【问题讨论】:

  • 您的方法可以简单地实现为return list.stream().filter(predicate).collect(Collectors.toList());,或者,如果它必须是ArrayList,您可以使用return list.stream().filter(predicate).collect(Collectors.toCollection(ArrayList::new));。

标签: java lambda java-8


【解决方案1】:

你需要给 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)));

【讨论】:

  • 谢谢伊兰。我认为问题是由于使用 (int) 而不是使用 Integer 来传递 Predicate 方法。
  • @NaveenGujjar 是的,我最初的解释是错误的,我修复了它。 List&lt;Integer&gt; 也是必需的。
  • 您甚至不需要将Integer 声明为 lambda 参数类型。它会被正确推断出来。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多