将对象实例的所有值添加到列表
Add all values of an instance of an object to a List
假设我有一个 class 'Dog' 有很多字符串值,我想把所有这些值都放在一个列表中,有没有比自己添加每个值更好的方法?
例如拿这个虚拟 class,请注意,如果重要的话,所有值都是字符串
public class Dog {
private String breed;
private String name;
private String origin;
[...] a lot more
getter and setter methods
}
Dog dog = new Dog([...] bla bla);
将实例的所有这些值放入列表中是否有比以下更好的方法:
public List<String> toList() {
List<String> list = new ArrayList<String>();
list.add(dog.getBreed);
list.add(dog.getName);
list.add(dog.getOrigin);
[...]
return list;
你可以这样想,一只狗有几个特性或属性,比如品种类型、起源、名称等等。您也可以将值添加到列表中,但最好保留一张地图,因为在检索时您必须知道要检索的内容。
维护一个属性和实际值的Map会更好。代码可能是这样的
public class Dog {
private Map<String,String> attributesMap = new HashMap<>();
//getter and setter for attributesMap
}
您可以创建 Dog 的实例 class 并像这样添加属性。
Dog dog = new Dog();
dog.getAttributesMap().put("breed", "some breed");
dog.getAttributesMap().put("origin", "some some origin");
System.out.println("What is the breed type: "+dog.getAttributesMap().get("breed");
你可以json连载。
考虑以下代码:
List<String> StringFieldList = Arrays.asList("breed", "name", "origin");
Gson gson = new Gson();
Dog dogObject = new Dog();
//set all field(s) value
JsonObject dogJsonObject = (JsonObject) gson.toJsonTree(dogObject, Dog.class);
for (String field : StringFieldList) {
String stringFieldValue = dogJsonObject.get(field).getAsString();
//Add stringFieldValue in list
}
使用反射你可以尝试get
对象字段的值:
Dog dog = new Dog("labrador","tarzan","uk"); // sample
List<String> values = Arrays.stream(Dog.class.getDeclaredFields())
.filter(f ->f.getType().equals(String.class))
.map(f -> {
try {
return (String) f.get(dog); // get the value of field from the object
} catch (IllegalAccessException e) {
return ""; /// handle in a cleaner way
}
}).collect(Collectors.toList());
你可以使用反射。
Dog dog = new Dog("val1", "val2", "val3");
List<String> list = new ArrayList<>();
for(Field field: Dog.class.getDeclaredFields()) {
// since fields are private we need to first mark it accesible
field.setAccessible(true);
if( field.getType().equals(String.class)) {
list.add((String) field.get(dog));
}
}
它与您的解决方案没有太大区别,但至少它控制了一些作为列表返回的位值。
private List<String> allValues = new ArrayList<>();
public Dog(String breed, String name, String origin) {
this.breed = setAndReturn(breed);
this.name = setAndReturn(name);
this.origin = setAndReturn(origin);
}
private String setAndReturn(String value) {
if (value != null) {
allValues.add(value);
}
return value;
}
public List<String> toList() {
return allValues;
}
假设我有一个 class 'Dog' 有很多字符串值,我想把所有这些值都放在一个列表中,有没有比自己添加每个值更好的方法?
例如拿这个虚拟 class,请注意,如果重要的话,所有值都是字符串
public class Dog {
private String breed;
private String name;
private String origin;
[...] a lot more
getter and setter methods
}
Dog dog = new Dog([...] bla bla);
将实例的所有这些值放入列表中是否有比以下更好的方法:
public List<String> toList() {
List<String> list = new ArrayList<String>();
list.add(dog.getBreed);
list.add(dog.getName);
list.add(dog.getOrigin);
[...]
return list;
你可以这样想,一只狗有几个特性或属性,比如品种类型、起源、名称等等。您也可以将值添加到列表中,但最好保留一张地图,因为在检索时您必须知道要检索的内容。
维护一个属性和实际值的Map会更好。代码可能是这样的
public class Dog {
private Map<String,String> attributesMap = new HashMap<>();
//getter and setter for attributesMap
}
您可以创建 Dog 的实例 class 并像这样添加属性。
Dog dog = new Dog();
dog.getAttributesMap().put("breed", "some breed");
dog.getAttributesMap().put("origin", "some some origin");
System.out.println("What is the breed type: "+dog.getAttributesMap().get("breed");
你可以json连载。 考虑以下代码:
List<String> StringFieldList = Arrays.asList("breed", "name", "origin");
Gson gson = new Gson();
Dog dogObject = new Dog();
//set all field(s) value
JsonObject dogJsonObject = (JsonObject) gson.toJsonTree(dogObject, Dog.class);
for (String field : StringFieldList) {
String stringFieldValue = dogJsonObject.get(field).getAsString();
//Add stringFieldValue in list
}
使用反射你可以尝试get
对象字段的值:
Dog dog = new Dog("labrador","tarzan","uk"); // sample
List<String> values = Arrays.stream(Dog.class.getDeclaredFields())
.filter(f ->f.getType().equals(String.class))
.map(f -> {
try {
return (String) f.get(dog); // get the value of field from the object
} catch (IllegalAccessException e) {
return ""; /// handle in a cleaner way
}
}).collect(Collectors.toList());
你可以使用反射。
Dog dog = new Dog("val1", "val2", "val3");
List<String> list = new ArrayList<>();
for(Field field: Dog.class.getDeclaredFields()) {
// since fields are private we need to first mark it accesible
field.setAccessible(true);
if( field.getType().equals(String.class)) {
list.add((String) field.get(dog));
}
}
它与您的解决方案没有太大区别,但至少它控制了一些作为列表返回的位值。
private List<String> allValues = new ArrayList<>();
public Dog(String breed, String name, String origin) {
this.breed = setAndReturn(breed);
this.name = setAndReturn(name);
this.origin = setAndReturn(origin);
}
private String setAndReturn(String value) {
if (value != null) {
allValues.add(value);
}
return value;
}
public List<String> toList() {
return allValues;
}