Printing the letters from A to Z using Java stream

  • A+
Category:Languages

I have this code but it gives me an error: Type mismatch: cannot convert from int to Character.

Stream.iterate('a', i -> i + 1).limit(26).forEach(System.out::println); 

Although it is fine to write int i = 'a';

I know I can write it like this but that seems like too much code for a simple task.

Stream.iterate('a', i -> (char)(i + 1)).limit(26).forEach(System.out::println); 

Why is the Java type inference is failing?

 


The reason why i -> i + 1 does not compile is because you're attempting to implicitly convert an int to a Character which the compiler cannot do itself alone.

In other words, you can think of Stream.iterate('a', i -> i + 1) as:

Stream.iterate('a', (Character i) -> {        int i1 = i + 1;          return i1; // not possible  }); 

As you have noted, explicitly casting to char solves it:

Stream.iterate('a', i -> (char)(i + 1))... 

Btw this is better done as:

IntStream.rangeClosed('a', 'z').forEach(c -> System.out.println((char)c)); 

This is better because:

  1. No boxing overhead thus more efficient
  2. if you were to stop at say letter h with the use of iterate you'd have to do more brain processing than just entering h as the upper bound with rangeClosed because you'd need to find the number to truncate the infinite stream upon.
  3. iterate generates an infinite stream which again has more overhead than a finite one.

etc...

Comment

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: