Что-нибудь в Гуаве похоже на эффект функциональной Java? - PullRequest
5 голосов
/ 02 марта 2012

Я знаю, что одной из целей чисто функционального программирования является устранение изменчивости и, следовательно, предотвращение побочных эффектов. Но давайте посмотрим правде в глаза, Java не является функциональным языком даже со всеми существующими библиотеками функционального программирования. На самом деле кажется, что некоторые из FP-библиотек знают и ожидают этого. Например, в функциональной Java существует класс Effect. В библиотеке FP Jedi есть интерфейс Command. Это позволяет - среди прочего - применять шаблон команд с тип-безопасностью к элементам Iterable без неприятного шаблона цикла.

Command<PhoneNumber> makeCall = new Command<PhoneNumber> {
    public void execute(PhoneNumber p) { p.call(); }
}
List<PhoneNumber> phoneList = ...
FunctionalPrimitives.forEach( phoneList, makeCall );

Итак, вопрос в том, есть ли что-то подобное в Гуаве?

ИЗД. ПОСЛЕ ОТВЕТА, ПРИНЯТОГО ДЛЯ УТОЧНЕНИЯ

Я разрабатываю framework , который помогает с "вертикальной проблемой", присущей большинству Java FP-библиотек, при определенных обстоятельствах. Таким образом, я бы не фактически сделал бы пример кода, как показано выше: то есть явно объявил бы реализацию нового класса Command со всеми его вертикальными помехами, просто с целью немедленного применения его сразу после объявления.

Я больше размышлял в русле фактического шаблона команд, где может быть несколько возможных команд, объявленных в другом месте, и только одна из них передается в код, который хочет применять его итеративно. Кроме того, цель моей среды - сделать ее более идиоматичной для создания объектов с функциональным интерфейсом (функций, предикатов, команд, других простых лямбд), не перемещая вертикальную проблему в другое место. Я давно понял, что это не в рамках Гуавы. Но поскольку командный интерфейс доступен в других библиотеках FP, я просто хотел узнать, существует ли аналог в Guava.

Более полный пример кода, использующий мой фреймворк, может выглядеть примерно так:

class Stuff {
    private final Stuff CALLS_TO = callsTo(Stuff.class); // a proxy
    public static final Command<Stuff> CMD1 = commandFor(CALLS_TO.someMethod1());
    public static final Command<Stuff> CMD2 = commandFor(CALLS_TO.someMethod2());

    // methods exist for use elsewhere, but are conveniently also wrapped as commands
    public void someMethod1() {...}
    public void someMethod2() {...}
}

class Activity {
    public void handleIt(List<Stuff> stuffs, Command<Stuff> doCmd) {
        doSomeThings();
        ...
        forEach(stuffs, doCmd);
        ...
        doOtherThings();
    }
}

1 Ответ

10 голосов
/ 02 марта 2012

Нет!

Кевин Бурриллион, руководитель проекта Guava, сказал о функциональных возможностях Guava:

«Синтаксис отстой.В то же время, этот материал сейчас, всегда был и всегда будет не чем иным, как временной мерой, пока не произойдет правильное изменение языка, и тогда мы сможем окончательно определиться с оптимальным синтаксисом и начать программирование в функциональном стиле.на самом деле делает жизнь лучше в Java на этот раз.Так что я не знаю, сколько усилий нужно приложить к функциям / предикатам;это больше в библиотеке, потому что вроде как должно быть, а не потому, что мы думаем, что это жемчужина короны ».

Мы, вероятно, значительно изменим нашу стратегию, когда появится Java 8, но этоЕще немного.

Кроме того, мы не нашли много вариантов использования, для которых мы думаем, что описанный вами интерфейс Command будет лучшим решением.Например, мы думаем, что приведенный выше код был бы гораздо лучше написан как

for(PhoneNumber phone : phoneList) {
  phone.call();
}

по старинке.Мы потенциально могли бы убедиться в достоинствах Command, но я думаю, что вариант использования «для каждого» почти всегда лучше сделать старомодным способом.

...