为了账号安全,请及时绑定邮箱和手机立即绑定

循环和流——在这种情况下怎么做?

循环和流——在这种情况下怎么做?

哈士奇WWW 2022-03-10 21:41:56
鉴于:@Entitypublic class Pixel {    @Id    Point position;    String color;我像这样存储像素:for (int row = 0; row < 20; row++) {    for (int col = 0; col < 20; col++) {        repository.save(new Pixel(new Point(row, col), "w3-flat-turquoise"));    }}这代表一个 20x20 的正方形现在我需要使用布局显示该列表。我可以轻松显示这样的正方形(工作):现在我想从数据库中检索像素并显示它们......但我找不到合适的方法。到目前为止,我有这个(不工作,因为最终的“我”不能改变):VerticalLayout lines = new VerticalLayout();HorizontalLayout line;int width = 20;List<Pixel> pixels = pixelRepository.findAll();for(final int i=0;i<width;++i) {    line = new HorizontalLayout();    Stream<Pixel> pixelLine = pixels.stream().filter(pixel -> pixel.getPosition().x == i);    for(int j=0;j<width;++j) {        addNewColorButton(line, pixelLine.filter(pixel -> pixel.getPosition().y == j).findFirst().get().color);    }    lines.add(line);}add(lines);什么是合适的算法来做到这一点?具有最终变量的工作解决方案: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();    Supplier<Stream<Pixel>> pixelLine = () -> pixels.stream().filter(pixel -> pixel.getPosition().x == finalI);    for(int j=0;j<width;++j) {        int finalJ = j;        addNewColorButton(line, pixelLine.get().filter(pixel -> pixel.getPosition().y == finalJ).findFirst().get().color);    }    lines.add(line);}add(lines);
查看完整描述

2 回答

?
RISEBY

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


查看完整回答
反对 回复 2022-03-10
?
宝慕林4294392

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]。这种方法有点容易出错并且无法包治百病,尤其是当您使用并行流时(这有点像是整个卖点)。


查看完整回答
反对 回复 2022-03-10
  • 2 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信