Причина, по которой i -> i + 1
не компилируется, состоит в том, что вы пытаетесь неявно преобразовать int
в Character
, что компилятор не может сделать сам в одиночку.
Другими словами, вы можете думать о Stream.iterate('a', i -> i + 1)
как:
Stream.iterate('a', (Character i) -> {
int i1 = i + 1;
return i1; // not possible
});
Как вы заметили, явно приведение к char
решает это:
Stream.iterate('a', i -> (char)(i + 1))...
Кстати, это лучше сделать как:
IntStream.rangeClosed('a', 'z').forEach(c -> System.out.println((char)c));
Это лучше, потому что:
- Нет накладных расходов на бокс, поэтому более эффективно
- , если вы остановитесь, скажем,буква
h
с использованием iterate
вам придется выполнить больше операций по обработке мозга, чем просто ввести h
в качестве верхней границы с rangeClosed
, потому что вам нужно будет найти число, чтобы обрезать бесконечный поток. - Наряду с боксом
iterate
создает бесконечный поток, который в данном конкретном случае имеет больше служебных данных, чем конечный с rangeClosed
.Кроме того, гораздо проще запускать IntStream.rangeClosed
параллельно, не то, что вы хотите в данном конкретном случае, но об этом следует помнить.Вот несколько рассуждений о Генераторах как источниках Брайана Гетца.
и т. д.