2014-11-06 74 views
21

我剛開始使用Java 8,我想知道是否有辦法編寫返回Function的方法?從Java 8中的Method返回Lambda?

現在我有方法如下圖所示:

Function<Integer, String> getMyFunction() { 
    return new Function<Integer, String>() { 
    @Override public String apply(Integer integer) { 
     return "Hello, world!" 
    } 
    } 
} 

有沒有更簡潔地寫在Java中8的方法嗎?我希望這會工作,但不會:

Function<Integer, String> getMyFunction() { 
    return (it) -> { return "Hello, world: " + it } 
} 

回答

25

擺脫你return語句的函數定義的內部:

Function<Integer, String> getMyFunction() { 
    return (it) -> "Hello, world: " + it; 
} 
13

你缺少半冒號:

return (it) -> { return "Hello, world: " + it; }; 

雖然注意到它可以縮寫爲:

return it -> "Hello, world: " + it; 
2

你可以簡單地把它寫這樣的:

Function<Integer, String> function = n -> "Hello, world " + n; 
1

因此,對於99%的情況,答案已經給出@assylias

你缺少半冒號:

return (it) -> { return "Hello, world: " + it; }; Although as noted it 可以縮短爲:

return it -> "Hello, world: " + it;

然而,我認爲值得補充的是,如果你想把你的lambda分配給一個變量(稍後使用)。 您可以通過打字這樣做:

Callable<YourClass> findIt =() -> returnInstanceOfYourClass(); 

然後你就可以輕鬆地使用它,一個例子這樣使用的:

if(dontNeedzToWrap()) { 
       return findIt.call(); 
    } 
return Wrapp.withTransaction(() -> findIt.call()); 

給出的東西甚至可以更簡單,如果Wrapp.withTransaction()方法接受與參數類似的Callable。 (我用這個JPA ATM)

3

我想指出的是,它可能更適合使用內置IntFunction在這種情況下:

IntFunction<String> getMyFunction() { 
    return it -> "Hello, world: " + it; 
} 

IntFunctionstandard API for functional interfaces的一部分它定義了一系列具有接口的好東西,主要與Java基元有關。