Я не думаю, что лямбды предназначены для этого ... Java не является функциональным языком программирования и никогда не будет таким, мы не передаем методы в качестве параметров. При этом помните, что Java является объектно-ориентированной, и с учетом этого мы можем делать все, что захотим. Первая идея - просто передать «объект, содержащий метод» в качестве параметра.
Поэтому, когда вам нужно «передать» метод, просто передайте экземпляр этого класса. Обратите внимание, что когда вы определяете метод, вы должны добавить в качестве параметра экземпляр класса, который содержит метод.
Это должно работать, но это не то, что мы хотим, потому что вы не можете переопределить метод, если у вас нет доступа к коду класса, а во многих случаях это невозможно; более того, я думаю, что если кому-то нужно передать метод в качестве параметра, то это потому, что поведение метода должно быть динамичным. Я имею в виду, что программист, использующий ваши классы, должен иметь возможность выбирать, что должен возвращать метод, но не его тип. К счастью для нас, у Java есть красивое и простое решение: абстрактные классы. Вкратце, абстрактные классы используются, когда вы знаете «сигнатуру» метода », но не знаете его поведение ... Вы можете обернуть имя и тип метода в абстрактный класс и передать экземпляр этого класса как параметр для метода ... Подождите ... разве это не то же самое, что и раньше? И можете ли вы иметь экземпляр абстрактного класса? Нет и нет ... но также да ... когда вы создаете абстрактный метод вы также должны переопределить его в классе, который расширяет абстрактный класс, и из-за динамического связывания Java Java всегда (если вы не объявите это static, private и некоторые другие вещи) будет использовать переопределенную версию этого. Вот пример ... Предположим, мы хотим применить функцию к массиву чисел: поэтому, если мы хотим возвести в квадрат, ввод-вывод должен выглядеть следующим образом [1,2,3,4, ...] -> [1,4,9,16 , ...] (в функциональном языке программирования, таком как haskell, это легко сделать благодаря некоторым инструментам, таким как 'map', ...). Обратите внимание, что в квадрате чисел нет ничего особенного, мы могли бы применить любую функцию, которую хотим т. Таким образом, код должен быть примерно таким [args], f -> [f (args)]. Возвращаясь к java => функция - это просто метод, поэтому нам нужна функция, которая применяет другую функцию к массиву. В двух словах, нам нужно передать метод в качестве параметра. Вот как бы я это сделал ==>
1) ОПРЕДЕЛИТЬ РЕКЛАМНЫЙ КЛАСС ОБОРОТОВ И МЕТОД
public abstract class Function
{
public abstract double f(double x);
}
2) ОПРЕДЕЛИТЬ КЛАСС С МЕТОДОМ APPLY_TO_ARRAY
public class ArrayMap
{
public static double[] apply_to_array(double[] arr, Function fun)
{
for(int i=0; i<arr.length;i++)
{
arr[i]=fun.f(arr[i]);
}
return arr;
}
}
3) СОЗДАЙТЕ КЛАСС ИСПЫТАНИЯ И ИМЕЙТЕ НЕКОТОРОЕ УДОВОЛЬСТВИЕ
public class Testclass extends Function
{
public static void main(String[] args)
{
double[] myarr = {1,2,3,4};
ArrayMap.apply_to_array(myarr, new Testclass());
for (double k : myarr)
{
System.out.println(k);
}
}
@Override
public double f(double x)
{
return Math.log(x);
}
}
Обратите внимание, что нам нужно передать объект типа Function, и, поскольку Testclass расширяет класс Function, мы можем его использовать, приведение происходит автоматически.