public class ArraysDemo {
public static void main(String[] args) {
int[] a = {0, 2, 4, 6, 8};
int[] b = {10, 12, 14, 16, 18};
Arrays.setAll(a, i -> b[i]+1);
System.out.println(Arrays.toString(a));
}
}
输出:[11, 13, 15, 17, 19]
使用的setAll()
函数来源如下:
public static void setAll(int[] array, IntUnaryOperator generator) {
Objects.requireNonNull(generator);
for (int i = 0; i < array.length; i++)
array[i] = generator.applyAsInt(i);
}
IntUnaryOperator
是一个功能接口,这是其源代码的一部分:
public interface IntUnaryOperator {
int applyAsInt(int operand);
// rest methods are omitted
}
如果我错了,请纠正我,但我对 Java 中 lambda 表达式的理解是,当我将 lambda 表达式作为参数传递给方法时,会创建并调用setAll()
实现该接口的匿名类的对象。并且 lambda 表达式本质上是该方法的实现,所以我相信它会转化为:IntUnaryOperator
generator
applyAsInt()
int applyAsInt(int operand){
return b[operand]+1;
}
对我来说它可以访问是有道理的,operand
因为它作为参数传递array[i] = generator.applyAsInt(i);
但是,我不明白它是如何操作b
的——它不是作为参数传递的,所以它怎么可能被引用?我错过了什么?