【问题标题】:Call constructor with arguments in a lambda expression [duplicate]在 lambda 表达式中使用参数调用构造函数 [重复]
【发布时间】:2017-06-27 10:36:07
【问题描述】:

我有 Employee 类:

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);
}

它说编译错误

Employee::new, 1L, "", ""
无法解析构造函数。

【问题讨论】:

标签: java lambda


【解决方案1】:

使用Supplier

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

仅供参考,Employee 实例只会在实际需要时创建。


如果您的构造函数没有参数,您可以使用方法引用Employee::new。如果您创建工厂方法,您仍然可以使用方法引用:

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

那么你可以:

.orElseGet(Employee::createDummy);

工厂方法实际上可以在任何你喜欢的类中。

【讨论】:

  • 工厂方法是静态的吧?
  • @Jan 不一定是,但如果不是,您需要一个工厂实例,您仍然可以使用方法引用:class Factory { Employee createDumy() {...}} 然后Factory f = new Factory();(可以是实例变量或其他)和.orElseGet(f::createDummy)。我认为静态工厂方法更易于使用和编码,因为您不需要实例。但是有时您想将工厂传递给需要一种方法来创建提供给它的实例的代码。例如,您的方法可以接受这样的供应商作为参数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多