2016-08-23 27 views
1

例如,我可能想要做的(在JavaScript)像這樣的任務:是否有Java的立即調用匿名函數?

var x = (function() { 
    // do some searching/calculating 
    return 12345; 
})(); 

而且在Java中,我該怎麼辦與Lambda表達式類似的東西?編譯器不像 像這樣:

Item similarItem =() -> { 
    for (Item i : POSSIBLE_ITEMS) { 
     if (i.name.equals(this.name)) return i; 
    } 
    return null; 
}(); 
+0

爲什麼要這麼做?你的JavaScript代碼做什麼不同,因爲它在一個IIFE? – Blorgbeard

+0

我不認爲這是可能的,因爲編譯器需要知道哪個函數接口是精確實現的lambda。 – nitish712

+4

如果您想要立即運行的代碼,請編寫不帶lambda的代碼。 –

回答

7

不,因爲lambdas需要目標類型。您可以做的最好的表現是:

Item similarItem = ((Supplier<Item>) (() -> { 
    for (Item i : POSSIBLE_ITEMS) { 
     if (i.name.equals(this.name)) return i; 
    } 
    return null; 
})).get(); 

您必須爲您的特定lambda使用正確的功能接口。正如你所看到的,它非常笨重,沒有用處。


UPDATE

上面的代碼的JavaScript代碼的直接轉換。但是,直接轉換代碼並不總能給出最佳結果。

在Java中,你會真正使用streams做什麼的代碼是做:

Item similarItem = POSSIBLE_ITEMS.stream() 
           .filter(i -> i.name.equals(this.name)) 
           .findFirst() 
           .orElse(null); 

上面的代碼假定POSSIBLE_ITEMSCollection,可能是List。如果它是一個數組,請使用它來代替:

Item similarItem = Arrays.stream(POSSIBLE_ITEMS) 
         .filter(i -> i.name.equals(this.name)) 
         .findFirst() 
         .orElse(null); 
+0

我喜歡你的答案,但發現它不完整,所以我擴展了它,而不是創建一個新的答案。希望沒關係。 – Andreas

+0

我愛流的想法!讓我想起了Gulp!這些數據流是否比集合迭代器的速度或記憶效率低? – Dylanthepiguy

相關問題