You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:57:08