Вопрос

Я пытаюсь реализовать отложенную последовательность (это означает, что следующий элемент вычисляется только при вызове функции 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(список, новая функция отображения());

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top