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

Java 在hashmap中,使用就地对象实例化设置自定义对象值,java,java-8,hashmap,Java,Java 8,Hashmap,我正在创建一个以自定义对象(比如Employee)为键的HashMap。 我没有对Employee类的修改权限。 Employee对象没有参数构造函数 假设Map empMap是我的Map对象。 如何在适当的位置实例化对象,设置值并将其放入映射中 Map<String, Employee> mymap = new HashMap<>(); myMap.put("employee_key", () -> { Employee e = new Employee(

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

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

简言之,我期望在将其作为值放入映射时进行就地实例化和赋值,而不使用额外的方法

在实例化值对象和设置类属性值时,希望
将一个键值对放入
映射中

  • 没有提供参数化构造函数的可能性
  • 不使用额外的方法和
  • 不创建工厂类
似乎几乎不可能实现或丑陋/不寻常,至少是这样

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

Map<String, Employee> myMap = new HashMap<>();
Employee employee = new Employee();
employee.setSalary(10000);
myMap.put("employee_key", employee);
Map myMap=newhashmap();
员工=新员工();
员工工资(10000);
myMap.put(“员工密钥”,员工);

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

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

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

更改您的员工,以便
setSalary
返回
this
;然后您可以编写
myMap.put(“employee_key”,newemployee().setSalary(10000)
。或者看看Lombok,它有that@EugeneOP说他不可能更改类别
Employee
。一开始我也忽略了这一点。第二句话:我没有修改Employee的权限class@deHaar在这种情况下,创建一个静态工厂方法,该方法将创建一个Employee:
static Employee createIt(int-salary){Employee e=new Employee();e.setSalary(salary);return e;}
并使用它。@Eugene我没有修改权限,所有setter都是无效的return!而且,没有额外的方法。所有要做的事情都到位。“不使用额外的方法”即使在第一个示例中,您也在使用一个方法。它是lambda的一个方法,但它仍然是一个方法。
myMap.compute("employee_key", (k, v) -> {
    Employee e = new Employee();
    e.setSalary(10000);
    return e;
});