首页 > 解决方案 > 如何在 java 1.8 的 reduce 方法中使用 StringBuilder?

问题描述

String s = "apples for you";
StringBuilder returnString = new StringBuilder("");
Arrays.stream(s.split(" "))
        .reduce(returnString, (acc, str) -> acc.append(str.charAt(0)));

每个单词的预期输出首字母,即afy.

但是在acc.append,处出现错误acc被视为String.

标签: javastringjava-8java-streamstringbuilder

解决方案


您的使用reduce不正确。您打算调用的重载是具有 3 个参数的重载,它还应采用二元运算符StringBuilder

StringBuilder returnString = Arrays.stream(s.split(" "))
        .reduce(new StringBuilder(""), 
                (acc, str) -> acc.append(str.charAt(0)), 
                (sb1, sb2) -> sb1.append(sb2));

如果您要在并行流上使用它,请执行可变缩减(使用 stream.collect)作为初始标识字符串构建器对象,否则可能会从多个线程不可预测地附加到:

StringBuilder returnString = Arrays.stream(s.split(" "))
        .collect(StringBuilder::new, 
                 (acc, str) -> acc.append(str.charAt(0)), 
                 StringBuilder::append);

推荐阅读