将for循环转换为concat String转换为lambda表达式
我有以下for循环,它循环遍历字符串列表并将每个单词的第一个字符存储在StringBuilder
。 我想知道如何将其转换为lambda表达式
StringBuilder chars = new StringBuilder(); for (String l : list) { chars.append(l.charAt(0)); }
假设您之后在StringBuilder
上调用了toString()
,我认为在将每个字符串映射到单字符子字符串之后,您只是在寻找Collectors.joining()
:
String result = list .stream() .map(s -> s.substring(0, 1)) .collect(Collectors.joining());
示例代码:
import java.util.*; import java.util.stream.*; public class Test { public static void main(String[] args) { List 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 } }
注意使用substring
而不是charAt
,所以我们仍然有一个字符串流可以使用。
大量的方法 – 最简单的选择 :坚持添加到StringBuilder
并执行此操作:
final StringBuilder chars = new StringBuilder(); list.forEach(l -> chars.append(l.charAt(0)));
如果不创建许多中间String对象,您可以这样做:
StringBuilder sb = list.stream() .mapToInt(l -> l.codePointAt(0)) .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append);
请注意,使用codePointAt
比charAt
要好得多,就像你的字符串以代理项对开头一样,使用charAt
可能会产生不可预测的结果。
以下是此问题的三种不同解决方案。 每个解决方案首先过滤空字符串,否则可能抛出StringIndexOutOfBoundsException
。
此解决方案与Tagir的解决方案相同,添加了用于过滤空字符串的代码。 我把它包括在这里主要是为了与我提供的其他两个解决方案进行比较。
List list = Arrays.asList("the", "", "quick", "", "brown", "", "fox"); StringBuilder builder = list.stream() .filter(s -> !s.isEmpty()) .mapToInt(s -> s.codePointAt(0)) .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append); String result = builder.toString(); Assert.assertEquals("tqbf", result);
第二个解决方案使用Eclipse Collections ,并利用在7.0版中添加的名为CodePointAdapter
的相对较新的容器类型。
MutableList list = Lists.mutable.with("the", "", "quick", "", "brown", "", "fox"); LazyIntIterable iterable = list.asLazy() .reject(String::isEmpty) .collectInt(s -> s.codePointAt(0)); String result = CodePointAdapter.from(iterable).toString(); Assert.assertEquals("tqbf", result);
第三种解决方案再次使用Eclipse Collections,但使用injectInto
和StringBuilder
而不是injectInto
。
MutableList list = Lists.mutable.with("the", "", "quick", "", "brown", "", "fox"); StringBuilder builder = list.asLazy() .reject(String::isEmpty) .collectInt(s -> s.codePointAt(0)) .injectInto(new StringBuilder(), StringBuilder::appendCodePoint); String result = builder.toString(); Assert.assertEquals("tqbf", result);
注意:我是Eclipse Collections的提交者。
使用方法参考的简单方法:
List list = Arrays.asList("ABC", "CDE"); StringBuilder sb = new StringBuilder(); list.forEach(sb::append); String concatString = sb.toString();