Lambda表达式中能否使用可变长度参数(int ...x)?如何正确使用?
Lambda表达式中使用可变长度参数(int ...x)的正确方法
Lambda表达式完全支持使用可变长度参数,你的错误源于对可变参数的本质理解和处理逻辑有误,下面一步步说明问题和解决方法:
为什么会出现"Operator '+' cannot be applied to 'int[]','int'"错误?
Java中可变长度参数int... x在编译时会被转换成int[] x,也就是你的Lambda参数x实际是一个数组对象。你写的(x) -> x+1试图直接把数组和int值做加法,这显然不符合语法规则,所以报错。
正确使用可变参数的Lambda写法
既然可变参数本质是数组,你需要遍历数组元素完成逻辑。比如要实现求和功能,可以这样写:
class calculations { public static void main(String[] args) { func obj = (x) -> { int total = 0; for (int num : x) { total += num; } return total; }; // 支持传入任意数量的int参数 int singleResult = obj.sum(10); int multiResult = obj.sum(1, 2, 3, 4); int emptyResult = obj.sum(); // 传入0个参数,返回0 System.out.println(singleResult); // 输出10 System.out.println(multiResult); // 输出10 System.out.println(emptyResult); // 输出0 } } interface func { int sum(int... x); }
也可以用Stream简化遍历逻辑:
func obj = (x) -> java.util.Arrays.stream(x).sum();
为什么(x,y,w) -> x+y+w无法生效?
你的接口方法签名是int sum(int... x),对应的Lambda必须匹配这个方法的参数列表——可变参数在方法签名里是单个参数(数组类型),而不是三个独立的int参数。所以Lambda不能拆成多个参数,必须用单个参数(可以写成(int... x)或者(x),编译器都会识别为数组)。
如果想让Lambda接受三个独立参数,你需要修改接口的方法签名为int sum(int x, int y, int w),但这就失去了可变参数支持任意数量参数的灵活性。
内容的提问来源于stack exchange,提问作者cimpoiesudanila19
相关产品推荐
相关产品推荐

