Java 8 Stream计算字符串数组总长度:编译错误相关问题咨询
你的流处理代码问题解析
嘿,我来帮你理清这段代码里的问题~
先澄清:map(String::length)本身不会报错
你提到向map()传入String::length时报错,其实这部分是完全合法的:
Arrays.stream(text)返回的是Stream<String>,map()方法接受一个Function接口的实现,而String::length正好符合Function<String, Integer>的要求(因为String.length()返回int,会自动装箱为Integer)。- 你看到的编译错误,其实是来自后面的
IntStream.of(...)调用——IntStream.of()的参数只能是int数组或者多个int值,它根本不接受Stream<Integer>类型的参数,这才是问题所在。
是否需要将流转换为IntStream?当然需要,但方式不对
你的目标是计算字符串长度的总和,确实需要将Stream<String>转换为处理原始类型int的IntStream,这样调用sum()才合理,但不是用IntStream.of()来包裹,而是应该用更直接的方法:
正确且高效的写法
用mapToInt()方法直接将Stream<String>转为IntStream,避免不必要的装箱拆箱:
String[] text = {"hello", "bye"}; int totalLength = Arrays.stream(text) .mapToInt(String::length) // 直接生成IntStream,无装箱 .sum();
这里mapToInt()接受ToIntFunction<String>,String::length完美适配(返回int),一步到位得到IntStream,再调用sum()就能得到总和。
如果非要用map()的替代写法(不推荐)
如果你坚持用map()得到Stream<Integer>,之后也可以转成IntStream,但会多一步拆箱操作,性能不如上面的写法:
// 不推荐,存在装箱拆箱开销 int totalLength = Arrays.stream(text) .map(String::length) // 得到Stream<Integer> .mapToInt(Integer::intValue) // 拆箱为IntStream .sum();
总结一下
map(String::length)本身没问题,报错是因为IntStream.of()参数类型不匹配;- 必须转换为
IntStream才能调用sum(),最优方式是用mapToInt(String::length)直接生成IntStream。
内容的提问来源于stack exchange,提问作者John Difool
相关产品推荐
相关产品推荐

