Вы можете создать рекурсивную функцию с помощью этого класса:
public class Recursive<I> {
private Recursive() {
}
private I i;
public static <I> I of(Function<RecursiveSupplier<I>, I> f) {
Recursive<I> rec = new Recursive<>();
RecursiveSupplier<I> sup = new RecursiveSupplier<>();
rec.i = f.apply(sup);
sup.i = rec.i;
return rec.i;
}
public static class RecursiveSupplier<I> {
private I i;
public I call() {
return i;
}
}
}
И тогда вы можете использовать любой функциональный интерфейс всего в 1 строке, используя лямбда и определение вашего функционального интерфейса, как показано ниже:
Function<Integer, Integer> factorial = Recursive.of(recursive ->
x -> x == 0 ? 1 : x * recursive.call().apply(x - 1));
System.out.println(factorial.apply(5));
Я нашел это очень интуитивно понятным и простым в использовании.
Механизм Зенда использует копию на записи, и когда Вы используете ссылку сами, это подвергается небольшим дополнительным издержкам. Может только найти это упоминание во время записи, хотя, и комментарии в руководство содержит другие ссылки.
(РЕДАКТИРОВАНИЕ) страница руководства на Объекты и ссылки содержат немного больше информации о том, как переменные объекта отличаются от ссылок.
Я вполне уверен, что не, это не быстрее. Кроме того, это говорит конкретно в руководстве, чтобы не попытаться использовать ссылки для увеличения производительности.
Редактирование: не Может найти, где это говорит, что, но это там!
Нет никакой потребности в добавлении & оператор при передаче объектов. В PHP 5 + объекты передаются ссылкой так или иначе.