2017-02-09 131 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