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