2016-03-05 74 views
1

我需要更改中的lambda事件處理程序內的局部變量。在java中編輯局部變量lambda

SerialPort comPorts[] = SerialPort.getCommPorts(); 
MenuItem[] portsItems = new MenuItem[10]; 
int q=0; 
    for (SerialPort port : comPorts) { 
     portsItems[q] = new MenuItem(port.getSystemPortName()); 
     portsItems[q].setOnAction(actionEvent -> { 
       portNum = q; 
       connect.setDisable(false); 
     }); 
     comPortsMenu.getItems().add(portsItems[q]); 
    } 

的問題是我需要在每個循環遞增Q,但我不能這樣做,因爲q必須最終有效最終將拉姆達內部使用。

+0

@AndrewTobilko你引用了他的確切單詞。 –

+0

使'q'成爲類實例字段。 –

+2

你在哪裏試圖增加值?如果你只需要「在循環中」,你可以在lambda表達式中做到這一點。如果你需要一個具有q值的最終變量,只需複製它:'final int pNumber = q;'然後'portNum = pNumber;'將起作用。 –

回答

2

我認爲你正在尋找類似

for (SerialPort port : comPorts) { 
    portsItems[q] = new MenuItem(port.getSystemPortName()); 
    int portNumber = q ; // effectively final 
    portsItems[q].setOnAction(actionEvent -> { 
     portNum = portNumber; 
     connect.setDisable(false); 
    }); 
    comPortsMenu.getItems().add(portsItems[q]); 

    // increment: 
    q++ ; 
} 
+0

我想他想改變lambda體內的變量,否則他沒有編譯錯誤。 – Andrew

+0

@AndrewTobilko不正確。 'q ++'寫入'q'因此'q'不是最終的。 @James_D你可以使這個變量成爲'final'。在這裏保持有效決定是毫無意義的。 – fabian

+0

它工作感謝男人:) 可以解釋我如何解決它,爲什麼我們必須在lambda中使用final? –

0

你可以做一個整數的選項卡,並使用第一個索引來增加。 在lambda變量被捕獲,所以引用必須是最終的。 所以引用不能被另一個替代。這是因爲我們可以使用一個int值對象的數組。

+0

你做吧? –

+0

int [] value = new int [1]; value [0] –

0

如果你是開放的使用Apache的百科全書,類易變*家庭提供價值的封友好「拳擊」一個好的機制,因爲框架提供的大寫字母框沒有。

對於上面的情況,將q替換爲MutableInt是可行的。

這就是說,通過使用這個特殊的例子,你可以通過使用portsItems的(可變長度)列表和相應的'port'值的add()和size() - 1組合來獲得更好的結果。