Java8 Lambda表达式和foreach的问题

3

我有以下列表:

List<String> fruits = new ArrayList<>();
fruits.add("apple");
fruits.add("mango");
fruits.add("grapes");
System.out.println(fruits.toString());

我正在使用lambda表达式来打印列表,例如:
fruits.forEach(item->System.out.println(item));

它目前运行良好,我的需求是需要遍历列表并将项目连接成字符串。

String stringFruits = "";
fruits.forEach(item->stringFruits = stringFruits+item);

这里出现了一个编译时错误,提示在lambda表达式中使用的变量值应该是有效的final,有没有办法在Java 8中解决这个问题?


3
String stringFruits = fruits.stream().collect(Collectors.joining()); - Eran
@Eran 谢谢,它起作用了。 - robin
4个回答

7
你需要通过一个分隔符 , 来进行连接。当然你也可以选择其他的分隔符。
 String result = fruits.stream().collect(Collectors.joining(","));
 System.out.println(result);

大材小用。在这种情况下,有一个方便简单的方法String.join(…) - Holger

4

Java8引入了一个StringJoiner,它可以满足您的需求(是另一种替代方案,与Eran的评论相同)。

StringJoiner sj = new StringJoiner("-,-");
fruits.forEach(item -> sj.add(item));

这里是文档

编辑:

为了后人,也可以翻译以下内容:

String result = fruits.stream().collect(Collectors.joining(","));
System.out.println(result);

或者
String stringFruits = String.join(", ", fruits);
System.out.println(stringFruits);

感谢@Holger的贡献和支持。


2
既然这么实用,String.join(…)已经可以做到了 - Holger

3

您完全不需要手动完成这个过程。如果您的源是一个 List,您可以直接使用:

String stringFruits = String.join(", ", fruits);
System.out.println(stringFruits);

String.join(…) 的第一个参数是分隔符。


1

或者是Java8之前的解决方案:

String combined = "";
for (String s : fruits) {
   combined += s;
}

...并且有一个分隔符:

String combined = "";
for (String s : fruits) {
   combined = combined + ", " + s;
}

在循环时最好使用 StringBuilder。在循环中进行字符串拼接会导致性能呈指数级下降。 - shmosel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接