Как я могу написать функцию более высокого порядка, как карту, или уменьшить в Java? - PullRequest
5 голосов
/ 26 апреля 2011

Я прочитал статью о программном обеспечении Joel On Software об идее использования функций более высокого порядка, чтобы значительно упростить код за счет использования карты и сокращения.Он упомянул, что это было трудно сделать на Java.Статья: http://www.joelonsoftware.com/items/2006/08/01.html

Пример из статьи ниже циклически перебирает массив и использует функцию fn, переданную в качестве аргумента для каждого элемента в массиве:

function map(fn, a)
{
    for (i = 0; i < a.length; i++)
    {
        a[i] = fn(a[i]);
    }
}

На практике это вызывается аналогично приведенному ниже:

map( function(x){return x*2;}, a );
map( alert, a );

В идеале я хотел бы написать функцию карты для работы с массивами или коллекциями любого типа, если это возможно.

Я искал в Интернете, и мне трудно найти ресурсы на эту тему.Во-первых, возможны ли анонимные функции в Java?Можно ли это сделать по-другому?Будет ли это доступно в будущей версии Java?Если возможно, как я могу это сделать?

Я полагаю, что если это невозможно в Java, существует некая «схема» / методика, которую люди используют для достижения того же эффекта, поскольку я представляю, что анонимные функцииочень мощный инструмент в мире программного обеспечения.Единственный похожий вопрос, который мне удалось найти, заключался в следующем: Обобщения Java - реализация функций более высокого порядка, таких как map , и для меня это абсолютно бессмысленно.

Ответы [ 5 ]

6 голосов
/ 26 апреля 2011

Гуава предоставляет карту (но вместо этого она называется transform и находится в служебных классах, таких как Lists и Collections2). Однако это не обеспечивает сгибание / уменьшение.

В любом случае синтаксис для использования transform выглядит очень неуклюжим по сравнению с использованием map в Схеме. Это немного похоже на попытку писать левой рукой, если вы правша. Но это Java; что вы ожидаете. : -Р

3 голосов
/ 26 апреля 2011

Анонимные классы с одним методом обеспечивают похожий, но гораздо более подробный способ написания анонимной функции в Java. Например, вы могли бы иметь:

Iterable<Source> foos = ...;
Iterable<Destination> mappedFoos = foos.map(new Function<Source, Destination>() 
{
    public Destination apply(Source item) { return ... }
});

Пример библиотеки Java с функциональным стилем см. Гуава

2 голосов
/ 26 апреля 2011
interface Func<V,A> {
    V call (A a);
}

static <V,A> List<V> map (Func<V,A> func, List<A> as) {
    List<V> vs = new ArrayList<V>(as.size());
    for (A a : as) {
        Vs.add(func.call(a));
    }
    return vs;
}
2 голосов
/ 26 апреля 2011

Похоже на это?

Как мне написать анонимную функцию на Java?

PS: попробовать Функциональная Java .Может быть, это может дать вам подсказки.

0 голосов
/ 19 февраля 2014

Paguro имеет открытую реализацию функций более высокого порядка . Первоначальный тест показал, что он на 98% быстрее, чем собственный цикл Java forEach. Поддерживаемые ею операции применяются без изменения базовой коллекции. Он выводит в безопасные по типу версии неизменяемых (и иногда изменяемых) коллекций Clojure. Transformable встроен в неизменяемые и неизменяемые коллекции и интерфейсы Paguro . Чтобы использовать необработанную коллекцию java.util в качестве входных данных, просто оберните ее функцией xform().

...