Java forEach不使用IntStream.range在flatMap上工作

JL_*_*_SO 5 java java-8 java-stream

从java2s的这个简单示例开始:

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

输出是

X
M
L
J
a
v
a
C
S
S
Run Code Online (Sandbox Code Playgroud)

我试图了解flatMap内部发生了什么.我想看看IntStream.range的输出,但我无法让它工作.看起来你可以将一个forEach(SOP)打到一个IntStream.range(a,b)上,但当它在flatMap函数内部时,就无法完成(而且我没有注意到整个name -> IntStream.range(0, name.length()).mapToObj(name::charAt)都是flatMap函数的参数.如何将flatMap函数与IntStream.range一起使用,将字符串转换为与单词长度对应的数字序列?

我试过这个:

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

但它没有编译.我期待这条线

.flatMap(name ->  IntStream.range(0, name.length())) 
Run Code Online (Sandbox Code Playgroud)

取字符串并将其转换为0,1,2,0,1,2,3,0,1,2.我有什么误会?如何使用输出得到这个数字序列name -> IntStream.range(0, name.length())
先感谢您.

Joh*_*ica 7

编译器错误是:

/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
Run Code Online (Sandbox Code Playgroud)

重要的是:

IntStream无法转换为Stream <?扩展R>

An IntStream是一种针对整数优化的流形式,但它不直接兼容Stream<Integer>.

您需要调用boxed()将其转换为对象流:

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

或致电flatMapToInt:

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

你有正确的想法,只需要稍微调整一下,让Java了解你.