Вот решение, которое выглядит довольно близко к коду javascript:
import java.time.LocalDate;
public class Showcase {
public static void main(String[] args) {
LocalDate date = LocalDate.now();
double result1 = getPrice(priceFunction1, date);
double result2 = getPrice(priceFunction2, date);
}
private static double getPrice(PriceFunction priceFunction, LocalDate date) {
return priceFunction.getPrice(date);
}
private static final PriceFunction priceFunction1 = date -> date.getYear() * 0.5;
private static final PriceFunction priceFunction2 = date -> date.getYear() * 1.5;
@FunctionalInterface
private interface PriceFunction {
double getPrice(LocalDate date);
}
}
Вместо использования стандартных функциональных интерфейсов из языка java, таких как Function
, просто определите новый функционал интерфейс, который точно соответствует требованиям вашей функции: он принимает дату и возвращает двойное значение.
Функция getPrice принимает такую «функцию» в качестве первого аргумента, затем мы должны передать дату (javascript области видимости там немного легче ...). Сами «функции» являются лямбда-выражениями, и мы можем хранить их как поля или константы c.
Пурист может кричать, что я не выбрал кричащий случай для имен, но я специально отклонился от общих соглашений об именах ради удобства чтения.