所以我有一个如下的列表,其中包含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
。有没有办法可以做到这一点?
答案 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()
。