How can you count the number of parameters while initializing a variadic function/lambda expression? Or: how can you determine the arity of a lambda-expression?
Example:
public class MathFunction{
private java.util.function.Function <double[], Double> function = null;
private int length = 0;
public MathFunction ( Function <double[], Double> pFunction ){
this.function = pFunction;
this.length = ???
}
}
Now, if you init a new MathFunction
like this,
MathFunction func = new MathFunction((x) -> Math.pow(x[0], x[1]));
how can you count the passed parameters (here: two) in the MathFunction
-constructor ?
答案 0 :(得分:3)
你不能。
MathFunction
声明一个构造函数,它接受一个参数,即Function
。此函数将在双数组上运行并返回Double
。但请注意,此函数可以在任何长度的任何双数组上运行。
该函数无法知道数组的长度:它只知道它可以在双数组上运行,无论其长度如何。
考虑一下这些lambdas:
x -> Math.pow(x[0], x[1])
x -> Math.pow(x[0], x[1]) + x[2]
x -> x[0]
它们都是有效的lambda,它们都符合相同的Function<double[], Double>
,所有它们都会在不同长度的数组上运行。
唯一的解决方案是将数组的长度作为第二个参数传递给构造函数。
public MathFunction ( Function <double[], Double> pFunction, int length ){
this.function = pFunction;
this.length = length;
}
顺便说一句,这不称为arity,这个术语指的是variable arguments。