猿问

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

鉴于:


@Entity

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


哈士奇WWW
浏览 122回答 2
2回答

RISEBY

您可以从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) {&nbsp; &nbsp; int finalI = i;&nbsp; &nbsp; line = new HorizontalLayout();&nbsp; &nbsp; Stream<Pixel> pixelLine = pixels.stream().filter(pixel -> pixel.getPosition().x == finalI);&nbsp; &nbsp; for (int j = 0; j < width; ++j) {&nbsp; &nbsp; &nbsp; &nbsp; int finalJ = j;&nbsp; &nbsp; &nbsp; &nbsp; addNewColorButton(line, pixelLine.filter(pixel -> pixel.getPosition().y == finalJ).findFirst().get().color);&nbsp; &nbsp; }&nbsp; &nbsp; lines.add(line);}add(lines);

宝慕林4294392

for(final int i=0;i<width;++i)出于明显的原因,这是相当虚假的。如果您需要i进入 lambda,您可以将其转换为一个数组,编译器会将其视为如下effectively final:int[] wrapped_i = new int[]{i}并从 lambda 内部访问它wrapped_i[0]。这种方法有点容易出错并且无法包治百病,尤其是当您使用并行流时(这有点像是整个卖点)。
随时随地看视频慕课网APP

相关分类

Java
我要回答