当前位置: 首页 > 知识库问答 >
问题:

为hashMap中存在的每个键调用setter

权烨磊
2023-03-14

我有一个哈希地图如下

Map<String, Object> attributes = new HashMap<String, Object> {
    {
        put("type", "A");
        put("duration", 10);
        put("isSet", true);
    }
}

现在我想用这些值填充一个对象。如何在 for 循环中调用 setter,而不是手动调用每个方法。假设我想用这些属性填充一个对象 ob。

共有1个答案

卜弘文
2023-03-14

您可以简单地使用java bean标准:

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

public void populateValues(Object bean, Map<String, Object> propertyValues) throws IntrospectionException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
    BeanInfo beanInfo = Introspector.getBeanInfo(Pojo.class);
    for(PropertyDescriptor pd : beanInfo.getPropertyDescriptors()) {
        if(pd.getWriteMethod() != null && propertyValues.containsKey(pd.getName())) {
            pd.getWriteMethod().invoke(bean, propertyValues.get(pd.getName()));
        }
    }
}

请注意,这通常不应该用于避免调用setter。只有当您已经有一个包含来自其他地方的此类条目的地图时,它才会很方便。

另请注意,此实现与条目 isSet=true 不兼容。它需要一个名为 set 的入口键。

您可能真的想看看构建器模式。如果使用java 8,您可能会对实现构建器模式的更通用方法感兴趣,如我的回答所示。

 类似资料:
  • 问题内容: 我有这个领域: 对于每个我都需要创建一个,其项是的值(恰好是HashMap本身)。 通过(无功能的)演示: 问题答案: 我知道我对那件事有些迟了,但是我也会分享我所做的,以防它对其他人有帮助:

  • 我需要一些帮助来替换HashMap中的值。HashMap包含每个键的多个值,这些值是从ArrayList中添加的。我想做的是替换键中的一个元素。例如,用户输入键1和索引2,这将是该键的值[1]=[A, B, C, D],索引2将是字母“C”,我想用“X”替换它,这样输出将是[1]=[A, B, X, D],这将在一个同时循环中。 输出: 1 张 AB 光盘 2 张 AB 光盘 3 张 AB 光盘

  • 我今天面试了,我的面试官问我如何在HashMap中存储具有相同键的多个值?她给了我这个例子—— 我在如何使用HashMap时给了她以下解决方案: 整数是字符串的长度,ArrayList将存储该特定长度的字符串。 面试官说这是使用HashMap的一种方式,但还有另一种方式我不需要ArrayList或任何其他数据结构。在面试期间,我无法想出任何解决方案,现在在谷歌搜索了足够多之后,我仍然一无所获。有人

  • 问题内容: 我有用户将在命令行/终端Java程序上输入的命令列表(i,h,t等)。我想存储命令/方法对的哈希: 这样我就可以得到类似以下的代码: 这可能吗?如果没有,那么简单的方法是什么? 问题答案: 使用Java 8+和Lambda表达式 使用lambda(可在Java 8+中使用)进行以下操作: 在这种情况下,我很懒惰并重用了该接口,但是也可以使用我在答案的Java 7版本中发明的-。 此外,

  • 我在Java有一个很大map=concurrenthashMap(),而Key、Value是某种对象结构。假设这个映射的键集是keyset。 现在我下面有一个计算程序。我的问题是我如何能够获得一个更好的性能通过不使用全地图锁。是否有任何选择,如使用每键锁或使用其他类型的数据结构? 考虑到这是一个很大的映射,使用every-key锁可能不是一种可接受的方法。