2015-11-12 4 views
1

Как вы можете подсчитать количество параметров при инициализации вариационной функции/лямбда-выражения? Или: как вы можете определить арность лямбда-выражения?Считать переменные параметры лямбда-функции в Java

Пример:

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 = ??? 
    } 
} 

Теперь, если вы инициализировать новый MathFunction как это,

MathFunction func = new MathFunction((x) -> Math.pow(x[0], x[1])); 

как вы можете рассчитывать переданные параметры (здесь два) в MathFunction -constructor?

+0

Вы можете использовать дольше и дольше массивы до тех пор, пока 'ArrayIndexOutOfBoundsException' не будет обнаружен. Это было бы безумным. Разумным способом является просто передать длину как отдельный аргумент. –

ответ

3

Вы не можете.

MathFunction объявляет конструктор, который принимает один параметр, который является Function. Эта функция будет работать с двойным массивом и возвращает Double. Но учтите, что эта функция может работать на любых двойных массивах любой длины.

Функция не может знать длину массива: она знает только, что она может работать на двойном массиве независимо от его длины.

Рассмотрим эти лямбды:

x -> Math.pow(x[0], x[1]) 
x -> Math.pow(x[0], x[1]) + x[2] 
x -> x[0] 

Они все действительные лямбды, все они соответствуют одному и тому же Function<double[], Double> и все из них (будет) работать на множестве различных длин.

Ваше единственное решение - передать длину массива конструктору в качестве второго аргумента.

public MathFunction (Function <double[], Double> pFunction, int length){  
    this.function = pFunction; 
    this.length = length; 
} 

Кстати, это не называется Арность, этот термин относится к variable arguments.

Смежные вопросы