从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函数内部时,那是无法完成的(而且我最初没有注意到整个
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);
但它不能编译。我期待线
.flatMap(name -> IntStream.range(0, name.length()))
将字符串转换为
0,1,2,0,1,2,3,0,1,2
。我有什么误会?如何使用name -> IntStream.range(0, name.length())
的输出获得此数字序列?先感谢您。
最佳答案
编译器错误是:
/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<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理解您。
关于java - Java forEach无法使用IntStream.range在flatMap上运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51316079/