Ответ 1
Причина, по которой i → я + 1
не компилируется, состоит в том, что вы пытаетесь неявно преобразовать int
в Character
который компилятор не может сделать сам по себе.
Другими словами, вы можете думать о Stream.iterate('a', я → я + 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
параллельно, не то, что вы хотите в данном конкретном случае, а то, о чем следует помнить. Вот несколько рассуждений о Генераторах как источниках Брайана Гетца.
так далее...