将List <CustomObject>的值映射到具有属性的对象

时间:2019-08-28 15:27:46

标签: java kotlin collections java-8 java-stream

我有一个具有2个属性的类

public class MyClass
{
     String name;
     String value;

     public MyClass(String name, String value)
     {
     this.name = name;
     this.value = value;
     }

}

我还有另一个具有很多属性的类

public class MyAttributeClass
{
     String attribute1;
     String attribute2;
     String attribute3;
     String attribute4;
           .
           .
           .

}

现在我有一个类似于下面的列表

List<MyClass> list = new ArrayList<>();
list.add(new MyClass("attribute1", "value1"));
list.add(new MyClass("attribute2", "value2"));
list.add(new MyClass("attribute3", "value3"));
list.add(new MyClass("attribute4", "value4"));

我必须填充从列表中获取的MyAttributeClass的所有4个属性的值。 最后,我的MyAttributeClass应该有类似的内容

public class MyAttributeClass
{
     String attribute1=value1;
     String attribute2=value2;
     String attribute3=value3;
     String attribute4=value4;

}

我可以遍历列表并创建地图,然后进行一次包含检查并填充对象,如下所示。有没有更好/有效的方法来做到这一点?

public void myMethod(List<MyClass> list)
{
        Map<String, String> mapresult = list.stream().collect(Collectors.toMap(MyClass::getName, MyClass::getValue));

        MyAttributeClass myAttributeClass = new MyAttributeClass();
        if (mapresult.containsKey("attribute1"))
        {
            myAttributeClass.setAttribute1(mapresult.get("attribute1"));
        }
        if (mapresult.containsKey("attribute2"))
        {
            myAttributeClass.setAttribute1(mapresult.get("attribute2"));
        }
        if (mapresult.containsKey("attribute3"))
        {
            myAttributeClass.setAttribute1(mapresult.get("attribute3"));
        }
        if (mapresult.containsKey("attribute4"))
        {
            myAttributeClass.setAttribute1(mapresult.get("attribute4"));
        }

    }

}

在Kotlin / Java中,有没有更好/有效的方法?

2 个答案:

答案 0 :(得分:1)

   public static void main(String[] args) throws IllegalAccessException {
        List<MyClass> list = new ArrayList<>();
        list.add(new MyClass("attribute1", "value1"));
        list.add(new MyClass("attribute2", "value2"));
        list.add(new MyClass("attribute3", "value3"));
        list.add(new MyClass("attribute4", "value4"));

        Map<String, String> mapresult = list.stream().collect(Collectors.toMap(MyClass::getName, MyClass::getValue));

        MyAttributeClass attributeClass = new MyAttributeClass();
        for (Field field : attributeClass.getClass().getDeclaredFields()) {
           field.setAccessible(true);
           String  res = mapresult.get(field.getName());
           if (nonNull(res)) {
               field.set(attributeClass, res);
           }
        }
    }

答案 1 :(得分:0)

基于反射的非常简单的示例

public class TestMap {

Map<String, Object> map = new HashMap<>();

public Attributes toAttributes() {
    Attributes attributes = new Attributes();
    for (Field field : attributes.getClass().getDeclaredFields()) {
        map.forEach((s, o) -> {
            if (field.getName().equals(s) && field.getType().equals(String.class)) {
                try {
                    field.set(attributes, o);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        });
    }
    return attributes;
}

public static void main(String[] args) {
    TestMap testMap = new TestMap();
    testMap.map.put("attribute1", "attribute1Value");
    testMap.map.put("attribute2", "attribute2Value");
    testMap.map.put("attribute3", "attribute3Value");
    testMap.map.put("attribute4", "attribute4Value");
    System.out.println(testMap.toAttributes().toString());
}


static class Attributes {
    String attribute1;
    String attribute2;
    String attribute3;
    String attribute4;

    @Override
    public String toString() {
        return "Attributes{" +
                "attribute1='" + attribute1 + '\'' +
                ", attribute2='" + attribute2 + '\'' +
                ", attribute3='" + attribute3 + '\'' +
                ", attribute4='" + attribute4 + '\'' +
                '}';
    }
}

}