Alguém sabe porque o CharAt não funciona?

package Stream;

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.UnaryOperator;

public class Map {
public static void main(String[] args) {

Consumer<String> print = System.out::print;



List<String> marcas = Arrays.asList("  bmw  " , "  fiat  " , "  volks  ");
marcas.stream().map(m-> m.toUpperCase()).forEach(print);


UnaryOperator<String> maiuscula= n -> n.toUpperCase();
UnaryOperator<String> primeiraletra= n -> n.charAt(0) + "";
UnaryOperator<String> grito= n -> n + "!!!";

marcas.stream()
.map(maiuscula)
.map(primeiraletra)
.map(grito)
.forEach(print);

}
}

Console -> BMW FIAT VOLKS !!! !!! !!!

Bom dia, estou aprendendo e não consigo achar o erro.
Obrigado pela ajuda!

Nesta linha:

marcas.stream().map(m -> m.toUpperCase()).forEach(print);

Você transforma as strings em maiúsculas e as imprime. O resultado é:

  BMW    FIAT    VOLKS  

Mas como o System.out::print não adiciona a quebra de linha no final, então qualquer coisa que for impressa depois é colocada na mesma linha.

E o que é impresso depois? É o resultado disso:

marcas.stream()
    .map(maiuscula)
    .map(primeiraletra)
    .map(grito)
    .forEach(print);

Ou seja, você converte a string para letras maiúsculas, e depois pega o primeiro caractere. Só que em todas as suas strings, o primeiro caractere é o espaço (veja que todas começam com um espaço). Só porque você chamou a variável de primeiraLetra, não quer dizer que vai pegar uma letra. charAt pega caracteres, e o espaço também é um caractere.

Ou seja, você está pegando o primeiro caractere das strings, e como todas começam com espaço, então na verdade está pegando só espaços. Depois você adiciona as exclamações, por isso o resultado é:

 !!! !!! !!!
(repare no espaço antes do primeiro !).

E como o primeiro print não adicionou a quebra de linha, isso é colocado logo depois do que foi impresso anteriormente, na mesma linha. Por isso que a saída é:

  BMW    FIAT    VOLKS   !!! !!! !!!

Repare que depois de “VOLKS” tem três espaços: dois são da string original, e um é do primeiro caractere da string (ou seja, o resultado do segundo print).

2 curtidas

Muito obrigado.
Explicação corretissima…
Agora deu certo :slight_smile:
Abraço!