2017-02-09 136 views
0

參數來調用構造函數我有Employee類:在lambda表達式

public class Employee { 

    private Long id; 
    private String name; 
    private String externalId; 

    public Employee(Long id, String name, String externalId) { 
     this.id = id; 
     this.name = name; 
     this.externalId = externalId; 
    } 

    //getters, setter 
} 

和員工服務返回僱員(NULL是可能的)。

private void performEmployeeProcessing() { 
    Long employeeId = 2L; 
    Object o = Optional.ofNullable(employeeService.getById(employeeId)) 
     .orElseGet(Employee::new, 1L, "", ""); 

    System.out.println(o); 
} 

它說編譯錯誤

員工::新,1L, 「」, 「」
無法解析構造。

+0

http://stackoverflow.com/questions/29835382/use-method-reference-with-parameter或http://stackoverflow.com/questions/31251629/java-8-supplier-with-arguments-in-the -constructor – Tom

回答

6

使用Supplier

.orElseGet(() -> new Employee(1L, "", "")); 

僅供參考,一個Employee實例將只當它的實際需要創建。


如果你的構造了無參數,你可以使用一個方法參考Employee::new

class Employee { 
    // rest of class 
    public static Employee createDummy() { 
     return new Employee(1L, "", ""); 
    } 
} 

,那麼你可以:

.orElseGet(Employee::createDummy); 

工廠方法實際上可能是在任何類,只要你喜歡,如果你創建一個工廠方法,你仍然可以使用方法參考。

+0

工廠方法是靜態的,對嗎? –

+0

@Jan它不一定是,但如果不是,你需要一個工廠實例,你仍然可以使用方法引用:'class Factory {Employee createDumy(){...}}'然後'工廠f = new Factory();''(可以是實例變量或其他)和'.orElseGet(f :: createDummy)'。我認爲靜態工廠方法的使用和代碼更簡單,因爲您不需要實例。但有些時候,您想將工廠傳遞給某些需要創建提供給它的實例的代碼。例如,你的方法可以接受這樣的供應商作爲論點 – Bohemian

0

使用此:

.orElseGet(new Employee(1L, "", "")); 
+0

這不適用於。orEseseGet要求供應商。嘗試'() - >新的員工(,,)'而不是。 – gmaslowski

+0

我認爲應該是'.orElse(新員工(1L,「」,「))'','.orElseGet'將'Supplier'作爲參數 – Strelok

+0

沒有時間來測試它,但編譯器說它ok – SCouto