3

我正在创建一个以自定义对象(比如员工)为键的 HashMap。 我对 Employee 类没有修改权限。 Employee 对象没有 args 构造函数说Map<String, Employee> empMap是我的地图对象。如何在适当位置实例化对象并设置值并将其放入地图中。

Map<String, Employee> mymap = new HashMap<>();
myMap.put("employee_key", () -> {
    Employee e = new Employee();
    e.setSalary(10000);
    return e;
});

这显示错误: lambda 转换的目标类型必须是接口。

不想做的事情:

myMap.put("employee_key", getEmployee(1000));
private Employee getEmployee(int salary){
    Employee e = new Employee();
    e.setSalary(salary);
    return e;
}

简而言之,我期望在不使用额外方法的情况下将其作为值放入地图中进行适当的实例化和分配。

4

2 回答 2

3

我同意 deHaar 的观点,即简单地使用put,无论是否使用便利方法,都可能是您的最佳选择。但是,使用以下方法可以很好地实现您所要求的compute

myMap.compute("employee_key", (k, v) -> {
    Employee e = new Employee();
    e.setSalary(10000);
    return e;
});
于 2019-07-16T11:24:38.413 回答
1

希望put一个键值对变成一个Map同时实例化值对象并设置类属性的值

  • 没有提供参数化构造函数的可能性,
  • 不使用额外的方法和
  • 无需创建工厂类

至少似乎几乎不可能实现或丑陋/不寻常。

我能想到的最短(但不是就地)解决方案是 instatiation 加上 setter 加上将对象放入 中Map,如下所示:

Map<String, Employee> myMap = new HashMap<>();
Employee employee = new Employee();
employee.setSalary(10000);
myMap.put("employee_key", employee);

这基本上是一个三行,甚至比你的非工作 lambda 少一行。

于 2019-07-16T11:08:48.873 回答