我有以下代码:
String fields = "";
listofObjects.stream().forEach(l -> fields = fields + l.text);
哪个不起作用,因为fields
应该是最终的。如何使用lambdas修改fields
?
答案 0 :(得分:11)
Streams和lambdas通常应该是无状态的。以下是针对您案例的传统解决方案:
String fields = listofObjects.stream()
.map(l -> l.text)
.collect(Collectors.joining());
答案 1 :(得分:8)
实现这项工作的最小变化就是使用StringBuilder
代替 - 而且效率更高:
StringBuilder builder = new StringBuilder();
listofObjects.stream().forEach(l -> builder.append(l.text));
String fields = builder.toString();
正如Martin所说,Collectors.joining()
提供了一般的字符串连接功能,但您需要先将对象流映射到字符串流。 (使用map
很容易,如果你经常需要这样做,你可以随时创建自己的收藏家。)
答案 2 :(得分:1)
如果您需要完全相同:
StringBuilder builder = new StringBuilder();
listofObjects.stream().forEach(l -> builder.append(l.text));
但更实用的方法是
fields = listofObjects.stream().map(l -> l.text).collect(Collectors.joining());
答案 3 :(得分:0)
我们可以使用reduce:
String fields = listofObjects.stream()
.reduce((x, y) -> x + y).orElse("");
或者,根据@shmosel的评论如下:
String fields = listofObjects.stream()
.reduce("", String::concat);