如何使用StringBuilder内部的减少方法在java 1.8?


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

您使用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);

ernest_k的答案当然是正确的。不过,值得补充的是,您似乎正在使用reduce来自己实现joining收集器,并且可能希望直接使用它:

String result = 
Arrays.stream(s.split(" ")).map(x -> x.substring(0, 1)).collect(Collectors.joining());

您可以使用reduce方法与Strings代替StringBuilder:

String str1 = "apples for you";
String str2 = Arrays
// split string into an array of words
.stream(str1.split("\s+"))
// first character of a word
.map(str -> str.charAt(0))
// character as string
.map(String::valueOf)
// reduce stream of strings to a single
// string by concatenating them
.reduce((s1, s2) -> s1 + s2)
// otherwise null
.orElse(null);
System.out.println(str2); // afy

参见:在java 8中使用Streams代替for循环

最新更新