【发布时间】:2023-03-04 12:07:01
【问题描述】:
我需要在 lambda 表达式中使用 Predicate 作为参数。我尝试了一个示例代码,但看到编译器错误。
我看到编译器对不同的参数以不同的方式处理相同的谓词。所以谓词参数n -> true and n -> false 有效,但n -> n%4 == 0 无效。
编译错误是:
The operator % is undefined for the argument type(s) Object, int
我修复了它(请参阅下面的替换代码)但我问我是否必须修复它,为什么?我不确定我是否遗漏了一些基本的东西。
完整代码如下:
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
public class PredicateAsArgumentInLambdaExpression {
public static int add(List<Integer> numList, Predicate predicate) {
int sum = 0;
for (int number : numList) {
if (predicate.test(number)) {
sum += number;
}
}
return sum;
}
public static void main(String args[]){
List<Integer> numList = new ArrayList<Integer>();
numList.add(new Integer(10));
numList.add(new Integer(20));
numList.add(new Integer(30));
numList.add(new Integer(40));
numList.add(new Integer(50));
System.out.println("Add Everything: "+add(numList, n -> true));
System.out.println("Add Nothing: "+add(numList, n -> false));
// System.out.println("Add Less Than 25: "+add(numList, n -> n < 25)); Compiler says: The operator < is undefined for the argument type(s) Object, int
System.out.println("Add Less Than 25: "+add(numList, n -> Integer.valueOf((int)n) < Integer.valueOf("25")));
// System.out.println("Add 4 Multiples: "+add(numList, n -> n % 4 == 0)); //Compiler says: The operator % is undefined for the argument type(s) Object, int
System.out.println("Add 4 Multiples: "+add(numList, n -> Integer.valueOf((int)n) % Integer.valueOf("4")==0));
}
}
注释掉的代码是无效的,每个代码下面的行是替换代码。代码按原样和预期工作,但我期望注释掉的代码应该工作! java.util.function.Predicate 中的 Predicate 有什么问题?如果您在其中找到答案,请提供规范页面的任何链接。
【问题讨论】:
-
用
Predicate<Integer>怎么样? -
@user3320018 你什么意思?
n -> true和n -> false与Predicate<Integer>一起工作对我来说很好。 -
@user3320018:看看kocko的回答,他告诉你如何使用
Predicate<Integer>。 -
@user3320018 "在
n -> true和n -> false的情况下没有编译器错误" 你想在这些情况下得到编译器错误吗?如果是,为什么?如果不是,那是什么问题(它工作正常)? -
“为什么对我的问题投了反对票”我猜有人不喜欢你的问题是由原始类型引起的这一事实,在每个关于泛型的教程中都有解释。跨度>
标签: java lambda type-conversion java-8 predicate