Java forEach que no trabaja en flatMap usando IntStream.range

JL_SO:

A partir de este ejemplo trivial de java2s:

 Stream.of("XML", "Java",  "CSS")
.flatMap(name ->  IntStream.range(0, name.length()).mapToObj(name::charAt))
.forEach(System.out::println);

la salida es

X
M
L
J
a
v
a
C
S
S

Estoy tratando de entender lo que está pasando en el interior del flatMap. Me gustaría ver la salida del IntStream.range, pero no puedo conseguir que funcione. Parece que se puede golpear a un forEach (SOP) sobre un IntStream.range (a, b), pero cuando está dentro de la función flatMap, que no se puede hacer (y no lo hice en un primer aviso de que el conjunto de name -> IntStream.range(0, name.length()).mapToObj(name::charAt)es el argumento de la función flatMap. ¿Cómo podría utilizar la función flatMap con IntStream.range para convertir las cadenas a una secuencia de números que corresponden a las longitudes de las palabras?

He intentado esto:

 Stream.of("XML", "Java",  "CSS")
        .flatMap(name ->  IntStream.range(0, name.length())) 
        .forEach(System.out::println);

pero no compila. Yo estaba esperando la línea

.flatMap(name ->  IntStream.range(0, name.length())) 

para tomar las cuerdas y convertirlos a 0,1,2,0,1,2,3,0,1,2. ¿Qué estoy malentendido? ¿Cómo puedo obtener esta secuencia de números utilizando la salida de name -> IntStream.range(0, name.length())?
Gracias de antemano.

John Kugelman:

El error del compilador es:

/MyClass.java:6: error: incompatible types: cannot infer type-variable(s) R
                .flatMap(name ->  IntStream.range(0, name.length())) 
                        ^
    (argument mismatch; bad return type in lambda expression
      IntStream cannot be converted to Stream<? extends R>)
  where R,T are type-variables:
    R extends Object declared in method <R>flatMap(Function<? super T,? extends Stream<? extends R>>)
    T extends Object declared in interface Stream
1 error

La cosa importante es:

IntStream no se puede convertir en corriente <? se extiende R>

Una IntStreames una forma de flujo optimizado para los números enteros, pero no es directamente compatible con Stream<Integer>.

Es necesario que sea llamada boxed()para convertirlo en una corriente de objetos:

Stream.of("XML", "Java",  "CSS")
        .flatMap(name ->  IntStream.range(0, name.length()).boxed()) 
        .forEach(System.out::println);

O llame a flatMapToInt:

Stream.of("XML", "Java",  "CSS")
        .flatMapToInt(name ->  IntStream.range(0, name.length())) 
        .forEach(System.out::println);

Usted tuvo la idea correcta, sólo necesitaba un poco de ajuste para hacer Java que entender.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=179095&siteId=1
Recomendado
Clasificación