2017-05-09 48 views
2

下面是其中lambda表達式是本方法和我希望它在其它方法中使用,以及不重複。Java的8如何重用蘭巴表達

public FeatureView getFeature(String featurekey) { 
    Feature feature = featureRepository.findByPrimaryKey(featurekey) 
      .orElseThrow(() -> new WebApplicationException(new ResponseEntity<>(
        ServiceError.of(404, String.format(FEATURE_NOT_FOUND, featurekey)), HttpStatus.NOT_FOUND))); 
    return Feature.getFeatureView(feature, extractFeatureStatus(feature)); 
} 

蘭巴表達

() -> new WebApplicationException(new ResponseEntity<>(
        ServiceError.of(404, String.format(FEATURE_NOT_FOUND, featurekey)), HttpStatus.NOT_FOUND)) 

回答

4

好吧,如果這是一個供應商,只需做到以下幾點:

Supplier<WebApplicationException> reusableSupplier =() -> new WebApplicationException(new ResponseEntity<>(
       ServiceError.of(404, String.format(FEATURE_NOT_FOUND, featurekey)), HttpStatus.NOT_FOUND)) 

和重用reusableSupplier,你需要它。

或者您可以使用方法引用工作,而不是,你只是有一個方法返回你想要的例外,如:

static WebApplicationException myReusableException() { 
    return new WebApplicationException(new ResponseEntity<>(
        ServiceError.of(404, String.format(FEATURE_NOT_FOUND, featurekey)), HttpStatus.NOT_FOUND)); 
} 

在您選購,叫你那麼可以只寫類似:

.orElseThrow(YourClass::myReusableException); 

編輯:萬一你想傳遞一個變量給它我會去的方法變種,並將其更改爲以下:

static Supplier<WebApplicationException myReusableException(T featureKey) { 
    return() -> new WebApplicationException(.... featureKey); 
} 

,並用它喜歡:

.orElseThrow(myReusableException(currentFeatureKey)); 

正如你可以看到返回值打可能導致有趣的結果。你也可以使用Function<T, Supplier<WebApplicationException>>,但我認爲這會很快變得麻煩。完成我將添加一個Function -variant不返回Supplier

Function<T, Exception> yourReusableFunction = featureKey -> new WebApplicationException(.... featureKey); // where T is the type of featureKey 

調用它:

.orElseThrow(() -> yourReusableFunction.apply(currentFeatureKey)); 
+0

謝謝。我如何將featurekey(變量)傳遞給此供應商? – Shoaib627

+0

@ Shoaib627你不通過它。您需要將代碼放在與'featureKey'相同的作用域中。 – Sweeper

+0

@ Shoaib627增加了一個變體,你可以在這裏傳遞featureKey ... – Roland

3

簡單:

Supplier<Exception> excSupplier =() -> new WebApplicationException(new ResponseEntity<>(
    ServiceError.of(404, String.format(FEATURE_NOT_FOUND, featurekey)), HttpStatus.NOT_FOUND)); 

然後可以使用excSupplier任何你想要的。

+0

謝謝。我如何將featurekey(變量)傳遞給此供應商? – Shoaib627

3

這裏噸如何做到這一點,不只是在這個特殊的情況,但通常

大家可能知道,lambda表達式可被用作功能性的接口類型值,比如ConsumerSupplierFunction等,所以,第一步是要弄清楚是什麼類型lambda表達式。在這裏,您有:

() -> new WebApplicationException(new ResponseEntity<>(
     ServiceError.of(404, String.format(FEATURE_NOT_FOUND, featurekey)), HttpStatus.NOT_FOUND)) 

它不需要參數並返回WebApplicationException。由此我們可以推斷出這是一個Supplier<WebApplicationException>。另一個例子是,如果你有一些需要一個參數和返回void,這將是一個Consumer

後你找出類型,你只需要給它一個名字。之後,您只需聲明一個帶有類型和名稱的變量,並用lambda表達式對其進行初始化。在你的情況下,這樣的:

​​

現在,你可以代替拉姆達使用這個新變量。只需將lambda表達式替換爲您提供的任何名稱即可。在你的情況下,這將是:

Feature feature = featureRepository.findByPrimaryKey(featurekey) 
     .orElseThrow(supplier); 
return Feature.getFeatureView(feature, extractFeatureStatus(feature));