Java 8 Stream中使用Collectors.joining()报错问题排查
代码报错原因及解决办法
这段代码报错的核心原因是:Collectors.joining()只能处理实现了CharSequence接口的元素流(比如String、StringBuilder这类),但你的代码经过一系列操作后,流中的元素是Character类型——Character并没有实现CharSequence接口,编译器找不到匹配的collect方法,因此报错。
问题出在map(Character::toLowerCase)这一步:调用这个方法后,流里的元素依然是Character对象,而Collectors.joining()无法直接拼接Character元素。
两种解决思路
- 思路一:将Character转换为String后再收集
修改map步骤,把Character转成String类型,让流元素符合joining的要求:
String s = str.chars() .mapToObj(c -> (char) c) .map(c -> String.valueOf(Character.toLowerCase(c))) .filter(c -> !Character.isWhitespace(c)) .collect(Collectors.joining());
- 思路二:直接在IntStream层面处理,减少对象转换
跳过转Character的步骤,直接对int类型的字符码点做处理,最后转成String,效率更高:
String s = str.chars() .map(Character::toLowerCase) .filter(c -> !Character.isWhitespace(c)) .mapToObj(c -> String.valueOf((char) c)) .collect(Collectors.joining());
内容的提问来源于stack exchange,提问作者Stillswarm
相关产品推荐
相关产品推荐

