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)
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)
请注意,使用codePointAt
比charAt
使用代理项对开始使用要好得多,使用charAt
时可能会产生不可预测的结果.
归档时间: |
|
查看次数: |
37178 次 |
最近记录: |