在hashmap中,使用就地对象实例化设置自定义对象值

时间:2019-07-16 10:49:33

标签: java java-8 hashmap

我正在使用自定义对象(例如Employee)作为键创建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;
}

简而言之,我期望就地实例化和赋值,同时将其作为值放置在地图中,而无需使用额外的方法

2 个答案:

答案 0 :(得分:2)

我同意deHaar的观点,简单地使用put(有或没有便利方法)可能是您的最佳选择。但是,使用compute方法可以很好地实现您所要求的:

myMap.compute("employee_key", (k, v) -> {
    Employee e = new Employee();
    e.setSalary(10000);
    return e;
});

答案 1 :(得分:1)

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

  • 无法提供参数化的构造函数,
  • 不使用其他方法,并且
  • 不创建工厂类

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

我能想到的最短的(但不是就地)解决方案是实例化,setter和将对象放入Map中,例如:

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

这基本上是三班轮,甚至比不工作的lambda少了一行。