如何在forEach中访问lambda之外的对象?

时间:2017-12-13 07:34:59

标签: java lambda

我有以下代码:

String fields = "";
listofObjects.stream().forEach(l -> fields = fields + l.text);

哪个不起作用,因为fields应该是最终的。如何使用lambdas修改fields

4 个答案:

答案 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);