【问题标题】:In hashmap , set custom object value with in place object instantiation在 hashmap 中,使用就地对象实例化设置自定义对象值
【发布时间】:2019-07-16 10:49:33
【问题描述】:

我正在创建一个以自定义对象(比如员工)为键的 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;
}

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

【问题讨论】:

  • 更改您的员工以便setSalary 返回this;那么你可以写myMap.put("employee_key", new Employee().setSalary(10000)。或者看看有方法的龙目岛
  • @Eugene OP 说他不可能更改课程Employee。我一开始也忽略了这一点。第二句:我对Employee类没有修改权限
  • @deHaar 在这种情况下创建一个静态工厂方法来创建一个 Employee : static Employee createIt(int salary) {Employee e = new Employee(); e.setSalary(salary); return e; } 并使用它。
  • @Eugene 我没有修改权限,所有设置器都返回无效!此外,没有额外的方法。一切准备就绪。
  • "不使用额外方法" 即使在您的第一个示例中,您正在使用一种方法。它是 lambda 的一种方法,但它仍然是一种方法。

标签: java java-8 hashmap


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在实例化值对象并设置类属性的值时,希望将put 键值对转换为Map

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多