[英]How does a StringBuilder reduce time a Java program takes drastically?
[英]How to use StringBuilder inside the reduce method in 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)));
預期 output 每個單詞的首字母,即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));
如果您要在並行 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ 上使用它,請執行可變歸約(使用 stream.collect)作為初始標識字符串構建器 object:否則可能會意外附加到多個線程
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());
您可以使用帶有String
s 而不是StringBuilder
的reduce
方法:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.