Java 8 Stream中StringBuilder的toString为何输出ASCII值?如何修复?
问题原因与修复方案
问题原因
String.chars()返回的是IntStream,其中每个元素是对应字符的ASCII整数码值。你调用x.append(y)时,实际触发的是StringBuilder.append(int)方法——这个方法会把整数直接转换成数字字符串拼接,而不是将ASCII码还原为对应的字符,所以最终输出的是一串连续的ASCII数字。
修复方法
核心是把IntStream中的整数转换成对应的字符,再添加到StringBuilder里,有两种简洁的实现方式:
方式1:直接在append时强转成char
修改collect的累加器,把x.append(y)改为x.append((char) y),这样调用的是StringBuilder.append(char)方法,会自动将ASCII码转为对应字符。
方式2:先把IntStream转成Stream
用mapToObj将整数流映射为字符流,再调用StringBuilder的append方法处理字符类型。
完整修复代码示例
方式1实现
class Solution { public static void main(String[] args) { String s = "zwdacb"; StringBuilder sb = s.chars() .sorted() .collect(() -> new StringBuilder(), (x, y) -> x.append((char) y), (StringBuilder sb1, StringBuilder sb2) -> sb1.append(sb2)); System.out.println(sb.toString()); // 输出:abcdwz } }
方式2实现
class Solution { public static void main(String[] args) { String s = "zwdacb"; StringBuilder sb = s.chars() .sorted() .mapToObj(c -> (char) c) .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append); System.out.println(sb.toString()); // 输出:abcdwz } }
内容的提问来源于stack exchange,提问作者curiousengineer
相关产品推荐
相关产品推荐

