将对象实例的所有值添加到列表

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;
}