如何在Collections.forEach()中打印计数

时间:2016-04-18 14:14:30

标签: java java-8

所以我有一个如下的列表,其中包含lambda表达式:

ArrayList<String> array = new ArrayList<>();
...
StringBuffer buf = new StringBuffer("");
array.stream().forEach((item) -> {
    buf.append("Counter here: " + item.toString() + "\n");
});
return buf.toString();

但我无法在forEach lambda表达式中实例化和修改变量,因为它必须是final。有没有办法可以做到这一点?

2 个答案:

答案 0 :(得分:2)

使用atomics:

AtomicInteger cnt = new AtomicInteger(0);
StringBuilder buf = new StringBuilder("");
array.stream().forEach((item) -> {
    buf.append("Counter here: " + cnt.incrementAndGet() + "\n");
});
return buf.toString();

答案 1 :(得分:0)

为计数器使用大小为1的int[]

ArrayList<String> array = new ArrayList<>();
int[] count = {0};
return array.stream().map(item -> count[0]++ + ":" + item)
  .collect(Collectors.joining("\n", "", "\n"));

int[]实际上是最终的。它的内容不一定是。

请注意,如果您使用StringBuilder收集器,您甚至不需要joining()