将for循环转换为concat String转换为lambda表达式

Fak*_* 10 25 java collections lambda java-8 java-stream

我有以下for循环,它遍历一个字符串列表并存储每个单词的第一个字符StringBuilder.我想知道如何将其转换为lambda表达式

StringBuilder chars = new StringBuilder();
for (String l : list) {
    chars.append(l.charAt(0));
}  
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 41

假设您toString()StringBuilder事后调用,我认为您只是Collectors.joining()在将每个字符串映射到单字符子字符串之后寻找:

String result = list
    .stream()
    .map(s -> s.substring(0, 1))
    .collect(Collectors.joining());
Run Code Online (Sandbox Code Playgroud)

示例代码:

import java.util.*;
import java.util.stream.*;

public class Test {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("foo");
        list.add("bar");
        list.add("baz");
        String result = list
            .stream()
            .map(s -> s.substring(0, 1))
            .collect(Collectors.joining());
        System.out.println(result); // fbb
    }
}
Run Code Online (Sandbox Code Playgroud)

注意使用substring而不是charAt,所以我们仍然有一个字符串流来使用.


Fri*_*rdt 18

很多方法可以做到这一点 - 最简单的选择:坚持添加到a StringBuilder并执行此操作:

    final StringBuilder chars = new StringBuilder();

    list.forEach(l -> chars.append(l.charAt(0)));
Run Code Online (Sandbox Code Playgroud)

  • 那么你可以只使用 `list.forEach(...)` 而不使用 `.stream()` (2认同)

Tag*_*eev 13

如果不创建许多中间String对象,您可以这样做:

StringBuilder sb = list.stream()
                       .mapToInt(l -> l.codePointAt(0))
                       .collect(StringBuilder::new, 
                                StringBuilder::appendCodePoint, 
                                StringBuilder::append);
Run Code Online (Sandbox Code Playgroud)

请注意,使用codePointAtcharAt使用代理项对开始使用要好得多,使用charAt时可能会产生不可预测的结果.