Java forEach无法使用IntStream.range在flatMap上运行

时间:2018-07-13 00:15:52

标签: 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);

输出为

X
M
L
J
a
v
a
C
S
S

我试图了解flatMap内部发生了什么。我想查看IntStream.range的输出,但是无法正常工作。 看来您可以将forEach(SOP)重击到IntStream.range(a,b)上,但是当它位于flatMap函数内部时,那是无法完成的(而且我最初并没有注意到整个{{ 1}}是flatMap函数的参数。 如何将FlatMap函数与IntStream.range一起使用,以将字符串转换为与单词长度相对应的数字序列?

我已经尝试过了:

name ->  IntStream.range(0, name.length()).mapToObj(name::charAt)

,但无法编译。我期待这行

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

获取字符串并将其转换为.flatMap(name -> IntStream.range(0, name.length())) 。我有什么误会?如何使用0,1,2,0,1,2,3,0,1,2的输出获得此数字序列?
预先谢谢你。

1 个答案:

答案 0 :(得分: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

重要的一点是:

  

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

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

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

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

或致电flatMapToInt

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

您有一个正确的想法,只需要进行一些调整即可使Java理解您。