5
votes

Comment transformer les champs de classe Java en un tableau de valeurs de chaîne

Je recherche une manière propre et élégante de transformer les variables d'un objet en un tableau basé sur les valeurs des variables.

Exemple:

public class Subject {

    public Subject(boolean music, boolean food, boolean sport, boolean business, boolean art) {
        this.music = music;
        this.food = food;
        this.sport = sport;
        this.business = business;
        this.art = art;
    }

    private final Long id;
    private final boolean music;
    private final boolean food;
    private final boolean sport;
    private final boolean business;
    private final boolean art;

}

Basé sur les valeurs de chaque champ, je veux ajouter le nom du champ sous forme de chaîne dans un tableau.

Exemple: nouveau sujet (vrai, vrai, vrai, faux, faux)

Résultat attendu: ["musique", "nourriture", "sport"]


0 commentaires

3 Réponses :


5
votes

En supposant qu'il n'y ait pas de getters, vous pouvez utiliser la réflexion:

Subject subject = new Subject(true, true, true, false, false);

Field[] fields = Subject.class.getDeclaredFields();   // Get the object's fields
List<String> result = new ArrayList<>();
Object value;

for(Field field : fields) {                           // Iterate over the object's fields

    field.setAccessible(true);                        // Ignore the private modifier
    value = field.get(subject);                       // Get the value stored in the field

    if(value instanceof Boolean && (Boolean)value) {  // If this field contains a boolean object and the boolean is set to true
        result.add(field.getName());                  // Add the field name to the list
    }
}
System.out.println(result); // ["music", "food", "sport"]


Exemple de travail


0 commentaires

2
votes

Pour une solution générale, vous pouvez utiliser la réflexion et les flux Java pour cela:

[music, food, sport]

Le résultat sera:

Subject subject = new Subject(true, true, true, false, false);
String[] trueFields = Arrays.stream(subject.getClass().getDeclaredFields())
        .filter(f -> {
            f.setAccessible(true);
            try {
                return f.getBoolean(subject);
            } catch (IllegalAccessException e) {
                return false;
            }
        })
        .map(Field::getName)
        .toArray(String[]::new);


0 commentaires

2
votes

Vous pouvez utiliser la réflexion de Java pour réaliser ce

 List<String> output =  new ArrayList<>();
    for(Field f:s.getClass().getDeclaredFields()) {
        if((f.getType().equals(boolean.class) || f.getType().equals(Boolean.class)) && f.getBoolean(s)) {
            output.add(f.getName());
        }
    }

    System.out.println(output);


0 commentaires