我有一个具有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中,有没有更好/有效的方法?
答案 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 + '\'' +
'}';
}
}
}