Композиция функций в Java
-
21-09-2019 - |
Вопрос
Я пытаюсь реализовать отложенную последовательность (это означает, что следующий элемент вычисляется только при вызове функции step), и одним из методов, которые она должна иметь, является "map", который получает функцию, которая влияет на все элементы.Самый элегантный способ сделать это - использовать композицию функций и присвоить новую функцию функциональной переменной, но поскольку функции не являются значениями первого класса в Java, я понятия не имею, как это сделать.
Я думал о создании класса, который содержит только функцию, в качестве своего рода оболочки "указателя на функцию", но я не вижу, как это можно использовать для композиции.
Редактировать:вопрос связан с домашним заданием.Кроме того, он должен быть способен обрабатывать несколько композиций по линиям map(map(map(stepFunction()))) ("map" в данном случае является функцией, заданной с помощью метода "map").
Решение
Добро пожаловать на Java и ее проблемы.
interface Function<T> {
public T eval(T argument);
}
class Lazy<T> {
private Iterator<T> source;
private Function<T> filter;
Lazy(final Iterator<t> source, final Function<T> filter) {
this.source = source;
this.filter = filter;
}
public T step() {
return filter.eval(source.next());
}
}
Другие советы
Коллекции Google имеет Function
тип, тот Functions.compose(Function, Function)
способ, позволяющий Iterables.transform(Iterable, Function)
метод и многое другое.
Вам не поможет, если это для домашнего задания (я действительно хочу, чтобы все раскрывали, когда их вопрос связан с домашним заданием).
В Java вы всегда делаете это с помощью class protocol.Видишь java.lang.Thread
и функция run для канонического примера.В Java нет "указателей на функции" или "функциональных переменных".
FWIW, эквивалентом "указателя на функцию" в Java является интерфейс с помощью одного-единственного метода.Вы реализуете интерфейс с помощью некоторого класса, который обеспечивает реализацию метода, а затем сохраняете ссылку на объект этого класса.
Изменение ссылки на другой объект класса, который реализует метод по-другому, эквивалентно изменению указателя функции, чтобы он указывал на другую функцию.
public static <T> void apply(final List<T> list, final Function<T> func)
{
for(final T val : list)
{
func.perform(val);
}
}
interface Function<T>
{
void apply(T value);
}
class DisplayFunction<T>
implements Function<T>
{
public void perform(T value)
{
System.out.println(value);
}
}
вызов apply(список, новая функция отображения());