Agregar todos los valores de una instancia de un objeto a una Lista

Digamos que tengo una clase 'Perro' con muchos valores de Cadena y quiero todos esos valores en una Lista, ¿habría alguna forma mejor que agregar cada valor por sí mismos?

Por ejemplo, tome esta clase ficticia, tenga en cuenta que todos los valores son cadenas si eso importa

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

¿Habría alguna forma mejor de obtener todos esos valores de una instancia en una Lista que:

public List<String> toList() {
    List<String> list = new ArrayList<String>();
    list.add(dog.getBreed);
    list.add(dog.getName);
    list.add(dog.getOrigin);
    [...]
    return list;
Respuesta 1

Puedes usar la reflexión.

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));
                }
            }
Respuesta: 2

Usando la reflexión puedes probar getel valor de los campos de objeto:

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());
Respuesta: 3

Puede pensar así que un perro tiene varias propiedades o atributos como el tipo de raza, origen, nombre y muchos más. También puede agregar los valores a la lista, pero será mejor mantener un mapa porque mientras recupera tiene que saber lo que está tratando de recuperar.

Será mejor mantener un Mapa de atributos y valores reales. El código puede ser así.

public class Dog {
    private Map<String,String> attributesMap = new HashMap<>();

    //getter and setter for attributesMap

}   

Puede crear una instancia de la clase Perro y agregar atributos como este.

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");
Respuesta: 4

Puedes json serialización. Considere el siguiente código:

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            
}
Respuesta: 5

Tengo una situación similar a una pregunta anterior sobre la emisión de XML. Estoy analizando datos en un SAX ContentHandler mientras los serializo en una secuencia. Sospecho que la solución en el enlace ...

Usando Java y Bouncy Castle 1.52, puedo cargar la clave privada a través del certificado PEM usando el siguiente código. También tengo un archivo private.key del mismo en formato PKCS8. ¿Cuál es el código a usar ...

He estado haciendo algunos experimentos propios con Spring Roo y parece ser bastante bueno, pero noté que esta herramienta hace un uso intensivo de AOP en la capa del modelo. Estoy pensando en crear un verdadero ...

Intento obtener la clave de KeyStore. Creé un almacén de claves por Keytool: keytool -genkeypair -dname "cn = Mark Jones, ou = JavaSoft, o = Sun, c = US" -alias business2 -keypass abcdtest -keystore C: \ workspace \ ...