簡體   English   中英

如何在 java 1.8 的 reduce 方法中使用 StringBuilder?

[英]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 而不是StringBuilderreduce方法:

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 循環

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM