2 回答
TA贡献1856条经验 获得超5个赞
您可以从ithat changesi的值创建一个最终对象。finalI价值是最终的,永远不会改变。
int finalI = i;
int finalJ = j;
这是添加final对象后的代码
VerticalLayout lines = new VerticalLayout();
HorizontalLayout line;
int width = 20;
List<Pixel> pixels = pixelRepository.findAll();
for (int i = 0; i < width; ++i) {
int finalI = i;
line = new HorizontalLayout();
Stream<Pixel> pixelLine = pixels.stream().filter(pixel -> pixel.getPosition().x == finalI);
for (int j = 0; j < width; ++j) {
int finalJ = j;
addNewColorButton(line, pixelLine.filter(pixel -> pixel.getPosition().y == finalJ).findFirst().get().color);
}
lines.add(line);
}
add(lines);
TA贡献2021条经验 获得超8个赞
for(final int i=0;i<width;++i)
出于明显的原因,这是相当虚假的。
如果您需要i
进入 lambda,您可以将其转换为一个数组,编译器会将其视为如下effectively final
:
int[] wrapped_i = new int[]{i}
并从 lambda 内部访问它wrapped_i[0]
。这种方法有点容易出错并且无法包治百病,尤其是当您使用并行流时(这有点像是整个卖点)。
添加回答
举报