Sortie de la différence entre chaque champ de deux objets en Java

MiscUtil.java


public interface MiscUtil {
    //Objet avant changement en o1 et objet après changement en o2(Même classe que o1)Spécifier
    //Si nouveau, spécifiez null pour o1
    default String getCompareFieldValuesString(Object o1, Object o2, List<Class<?>> skipFieldClasses, List<String> skipFieldNames) {
        try {
            Set<String> skipFieldNamesSet = new HashSet<>(skipFieldNames);
            Class<?> clazz = o1 != null ? o1.getClass() : o2.getClass();
            StringBuffer sb = new StringBuffer();
            Field[] fields = clazz.getDeclaredFields();
            for (Field field : fields) {
                field.setAccessible(true);
                Class<?> fieldClass = field.getType();
                if (isAssignable(fieldClass, skipFieldClasses)) {
                    continue;
                }
                String fieldName = field.getName();
                if (skipFieldNamesSet.contains(fieldName)) {
                    continue;
                }
                Object o1Value = o1 != null ? field.get(o1) : null;
                Object o2Value = field.get(o2);
                if (isAssignable(fieldClass, Arrays.asList(String.class)) && isEmpty((String) o1Value) && isEmpty((String) o2Value)) {
                    continue; //Les caractères nuls et vides de chaîne sont équivalents(Original de la proposition)
                }
                if (isAssignable(fieldClass, Arrays.asList(LocalDateTime.class, LocalTime.class))) {
                    fieldName = fieldName.replaceAll("Raw$", ""); //LocalDateTime ・ Ne pas afficher "Raw" à la fin du nom du champ LocalTime(Original de la proposition)
                }
                String o1ValueString = getValueString(o1Value);
                String o2ValueString = getValueString(o2Value);
                if (!equals(o1ValueString, o2ValueString)) {
                    if (sb.length() > 0) {
                        sb.append(", ");
                    }
                    if (o1 != null) {
                        sb.append(String.format("%s:%s->%s", fieldName, o1ValueString, o2ValueString));
                    } else {
                        sb.append(String.format("%s:%s", fieldName, o2ValueString));
                    }
                }
            }
            return sb.toString();
        } catch (Throwable throwable) {
            throw new RuntimeException(throwable);
        }
    }

    default boolean isAssignable(Class<?> fromClass, List<Class<?>> toClasses) {
        for (Class<?> toClass : toClasses) {
            if (toClass.isAssignableFrom(fromClass)) {
                return true;
            }
        }
        return false;
    }

    default boolean isEmpty(String s) {
        return StringUtils.isEmpty(s); //Les caractères nuls et vides sont traités comme vides
    }

    default boolean equals(Object o1, Object o2) {
        if (o1 != null) {
            return o1.equals(o2);
        }
        return false; //False même si les deux sont nuls(Cela devrait-il être vrai?)
    }

    default String getValueString(Object o) {
        if (o == null) {
            return "null";
        }
        if (o instanceof String) {
            String s = (String) o;
            return String.format("\"%s\"", escape(s));
        }
        if (o instanceof LocalDateTime) {
            return toStr(plus9Hours((LocalDateTime) o)); //Ajouter 9 heures(Original de la proposition)
        }
        if (o instanceof LocalTime) {
            return toStr(plus9Hours((LocalTime) o)); //Ajouter 9 heures(Original de la proposition)
        }
        if (o instanceof LocalDate) {
            return toStr((LocalDate) o);
        }
        return String.format("%s", o.toString());
    }

    default String escape(String s) {
        return s.replaceAll("\n", "\\\\n"); //Sauts de ligne\\Convertir en n
    }

    static final String DATE_FORMAT = "yyyy/MM/dd(E)";
    static final String TIME_FORMAT = "HH:mm";
    static final String DATETIME_FORMAT = DATE_FORMAT + " " + TIME_FORMAT;

    default String toStr(LocalDateTime datetime) {
        return datetime != null ? DateTimeFormatter.ofPattern(DATETIME_FORMAT, Locale.JAPANESE).format(datetime) : null;
    }

    default String toStr(LocalDate date) {
        return date != null ? DateTimeFormatter.ofPattern(DATE_FORMAT, Locale.JAPANESE).format(date) : null;
    }

    default String toStr(LocalTime time) {
        return time != null ? DateTimeFormatter.ofPattern(TIME_FORMAT, Locale.JAPANESE).format(time) : null;
    }

    default LocalDateTime plus9Hours(LocalDateTime localDateTime) {
        return localDateTime != null ? localDateTime.plusHours(9) : null;
    }

    default LocalTime plus9Hours(LocalTime localTime) {
        return localTime != null ? localTime.plusHours(9) : null;
    }
}

Recommended Posts

Sortie de la différence entre chaque champ de deux objets en Java
Obtenez le résultat de POST en Java
Différence entre final et immuable en Java
Mesurez facilement la taille des objets Java
Sortie du livre "Introduction à Java"
L'histoire de l'écriture de Java dans Emacs
Différence entre int et Integer en Java
[Rails] Différence de comportement entre delegate et has_many-through dans le cas de one-to-one-to-many
L'histoire de l'acquisition de Java Silver en deux mois de totalement inexpérimenté.
Comprendre la différence entre int et Integer et BigInteger en java et float et double
[Java] Comprendre la différence entre List et Set
L'histoire de la comparaison de chaînes de bas niveau en Java
[Java] Gestion des Java Beans dans la chaîne de méthodes
L'histoire de la fabrication d'un Othello ordinaire à Java
À propos de l'idée des classes anonymes en Java
[Android] Calculez facilement la différence entre deux dates
L'histoire de l'apprentissage de Java dans la première programmation
Mesurer la taille d'un dossier avec Java
Différence entre next () et nextLine () dans Java Scanner
Ressentez le passage du temps même à Java
[Java] Quelque chose est affiché comme "-0.0" dans la sortie
Importer des fichiers de la même hiérarchie en Java
Résumer le cycle de vie des objets Java à prendre en compte dans le développement Android
Faire correspondre le JSON du cas du serpent au champ du cas du chameau en Java (JVM)
Format de la sortie du journal par Tomcat lui-même dans Tomcat 8
Différences entre les classes et les instances dans Ruby
Parcourir les objets de classe dans Kotlin (au lieu de Java class name.class)
Calculer la différence entre les nombres dans un tableau Ruby
[Java] Différence entre statique final et final dans les variables membres
[JAVA] Quelle est la différence entre interface et abstract? ?? ??
[Java] Récupère le fichier dans le fichier jar quel que soit l'environnement
Les objets de la liste étaient des références, non? Confirmation de
Java Méthode à usage général qui récupère uniquement les différences entre les propriétés des objets de la même classe
Comprenez en 3 minutes! Une explication très approximative de la différence entre session et cookie
Modifier la qualité de stockage des images JPEG en Java
Sortie en multiples de 3
Récapitulez les éléments supplémentaires de la classe Optional dans Java 9
Quelle est la différence entre les responsabilités de la couche domaine et de la couche application dans l’architecture onion [DDD]
Comment gérer la différence dans chaque environnement avec yml sans augmenter le nombre de RAILS_ENV
A été effectué dans l'année de base de la semaine calendaire Java
[Note] Sortie Java de la somme des éléments pairs et impairs
Une explication rapide des cinq types de statique Java
Différence entre Java et JavaScript (comment trouver la moyenne)
Activez la cellule A1 de chaque feuille de fichier Excel avec Java
Comptez le nombre de chiffres après la virgule décimale en Java
[Java] Différence entre l’affectation d’une variable de type de base et l’affectation d’une variable de type de référence
[Java] Vérifiez la différence entre orElse et orElseGet avec IntStream
Pensez aux différences entre les fonctions et les méthodes (en Java)
Comment dériver le dernier jour du mois en Java
[Java] Différence entre l'erreur de débordement de pile et l'erreur de mémoire insuffisante
L'évaluation des courts-circuits est-elle vraiment rapide? Différence entre && et & en Java
[Java] Différence entre == et égal
Implémentation Java de tri-tree
Comparaison des chaînes de version lorsque vous souhaitez brancher le traitement entre deux versions (implémentation Java)
Envisagez d'implémenter une méthode qui renvoie la différence entre deux listes
Ceci est la sortie Excel en Java! Traduction de documents officiels "JXLS"
[Java] Obtenez les dates des derniers lundi et dimanche dans l'ordre