Что-нибудь в Guava, похожее на Functional Java's Effect? ​​

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

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

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

ИЗМЕНЕНО ПОСЛЕ ОТВЕТА, ПРИНЯТОГО ДЛЯ РАЗЪЯСНЕНИЯ

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

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

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

class Stuff {
    private final Stuff CALLS_TO = callsTo(Stuff.class); // a proxy
    public static final Command CMD1 = commandFor(CALLS_TO.someMethod1());
    public static final Command 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 stuffs, Command doCmd) {
        doSomeThings();
        ...
        forEach(stuffs, doCmd);
        ...
        doOtherThings();
    }
}

5
задан Kevin Welker 27 June 2013 в 17:56
поделиться