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