亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

循環和流——在這種情況下怎么做?

循環和流——在這種情況下怎么做?

哈士奇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 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號