Функциональные возможности Java 8 делают этот вопрос несравненно более важным. Хотя мы начинаем массово использовать рекурсию, StackOverflowException - это то, что мы ДОЛЖНЫ рассчитывать.
В лямбда-типах Java 8 нет ни одного из них, который генерирует исключение StackOverflowException. Итак, мы должны создать такой. Это абсолютно необходимо, без этого мы не пройдем даже IDE-контроль.
Например, Integer -> Integer тип функции может выглядеть так:
@FunctionalInterface
public interface SoFunction <U> {
public U apply(Integer index) throws StackOverflowException;
}
После этого мы можем написать функцию, которая будет принимать лямбда-выражения, генерирующие исключение StackOverflowException.
public T get(int currentIndex) throws StackOverflowException{
И только теперь мы можем создать рекурсивную лямбду:
fiboSequence.setSequenceFunction(
(i) ->
fiboSequence.get(i-2).add(fiboSequence.get(i-1))
);
После этого мы можем вызвать рекурсивную цепочку fiboSequence.get(i)
и получить результат или StackOverflowException, если вся цепочка была неисчислимой.
В случае использования рекурсии SO приобретает совершенно иной смысл: вы прыгнули слишком глубоко, повторите его, разделив на более мелкие шаги.