Geben Sie die Differenz zwischen jedem Feld zweier Objekte in Java aus

MiscUtil.java


public interface MiscUtil {
    //Objekt vor Änderung zu o1 und Objekt nach Änderung zu o2(Gleiche Klasse wie o1)Angeben
    //Wenn neu, geben Sie null für o1 an
    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; //String null und leere Zeichen sind äquivalent(Vorschlag original)
                }
                if (isAssignable(fieldClass, Arrays.asList(LocalDateTime.class, LocalTime.class))) {
                    fieldName = fieldName.replaceAll("Raw$", ""); //LocalDateTime ・ Geben Sie "Raw" nicht am Ende des LocalTime-Feldnamens aus(Vorschlag original)
                }
                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); //Sowohl Null- als auch Leerzeichen werden als leer behandelt
    }

    default boolean equals(Object o1, Object o2) {
        if (o1 != null) {
            return o1.equals(o2);
        }
        return false; //Falsch, auch wenn beide null sind(Sollte es wahr sein?)
    }

    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)); //9 Stunden hinzufügen(Vorschlag original)
        }
        if (o instanceof LocalTime) {
            return toStr(plus9Hours((LocalTime) o)); //9 Stunden hinzufügen(Vorschlag original)
        }
        if (o instanceof LocalDate) {
            return toStr((LocalDate) o);
        }
        return String.format("%s", o.toString());
    }

    default String escape(String s) {
        return s.replaceAll("\n", "\\\\n"); //Zeilenumbrüche\\In n konvertieren
    }

    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

Geben Sie die Differenz zwischen jedem Feld zweier Objekte in Java aus
Holen Sie sich das Ergebnis von POST in Java
Unterschied zwischen final und Immutable in Java
Messen Sie einfach die Größe von Java-Objekten
Ausgabe des Buches "Einführung in Java"
Die Geschichte des Schreibens von Java in Emacs
Unterschied zwischen int und Integer in Java
[Rails] Unterschied im Verhalten zwischen Delegat und has_many-through bei Eins-zu-Eins-zu-Viele
Die Geschichte des Erwerbs von Java Silver in zwei Monaten von völlig unerfahrenen.
Verstehen Sie den Unterschied zwischen int und Integer und BigInteger in Java und float und double
[Java] Verstehe den Unterschied zwischen List und Set
Die Geschichte des einfachen String-Vergleichs in Java
[Java] Behandlung von Java Beans in der Methodenkette
Die Geschichte eines gewöhnlichen Othello in Java
Über die Idee anonymer Klassen in Java
[Android] Berechnen Sie einfach die Differenz zwischen zwei Daten
Die Geschichte des Lernens von Java in der ersten Programmierung
Messen Sie die Größe eines Ordners mit Java
Unterschied zwischen next () und nextLine () in Java Scanner
Spüren Sie den Lauf der Zeit auch in Java
[Java] In der Ausgabe wird etwas als "-0.0" angezeigt
Importieren Sie Dateien derselben Hierarchie in Java
Fassen Sie den Lebenszyklus von Java-Objekten zusammen, die bei der Android-Entwicklung berücksichtigt werden müssen
Stellen Sie sicher, dass der JSON des Schlangenfalls dem Feld des Kamelfalls in Java (JVM) entspricht.
Format der Protokollausgabe von Tomcat selbst in Tomcat 8
Unterschiede zwischen Klassen und Instanzen in Ruby
Durchsuchen Sie Klassenobjekte in Kotlin (anstelle der Java-Klasse name.class).
Berechnen Sie die Differenz zwischen Zahlen in einem Ruby-Array
[Java] Unterschied zwischen statischem final und final in Mitgliedsvariablen
[JAVA] Was ist der Unterschied zwischen Schnittstelle und Zusammenfassung? ?? ??
[Java] Holen Sie sich die Datei unabhängig von der Umgebung in das JAR
Die Objekte in der Liste waren Referenzen, richtig? Bestätigung von
Java Allzweckmethode, die nur die Unterschiede zwischen den Eigenschaften von Objekten derselben Klasse abruft
Verstehe in 3 Minuten! Eine sehr grobe Erklärung des Unterschieds zwischen Sitzung und Cookie
Ändern Sie die Speicherqualität von JPEG-Bildern in Java
Ausgabe in Vielfachen von 3
Fassen Sie die zusätzlichen Elemente der optionalen Klasse in Java 9 zusammen
Was ist der Unterschied zwischen den Verantwortlichkeiten der Domänenschicht und der Anwendungsschicht in der Zwiebelarchitektur [DDD]?
So verwalten Sie den Unterschied in jeder Umgebung mit yml, ohne die Anzahl von RAILS_ENV zu erhöhen
Wurde im Basisjahr der Java-Kalenderwoche durchgeführt
[Hinweis] Java Ausgabe der Summe von ungeraden und geraden Elementen
Eine kurze Erklärung der fünf Arten von Java Static
Unterschied zwischen Java und JavaScript (wie man den Durchschnitt findet)
Aktivieren Sie die Zelle A1 jeder Excel-Datei mit Java
Zählen Sie die Anzahl der Stellen nach dem Dezimalpunkt in Java
[Java] Unterschied zwischen der Zuweisung der Basistypvariablen und der Zuordnung der Referenztypvariablen
[Java] Überprüfen Sie den Unterschied zwischen orElse und orElseGet mit IntStream
Denken Sie über die Unterschiede zwischen Funktionen und Methoden nach (in Java)
So leiten Sie den letzten Tag des Monats in Java ab
[Java] Unterschied zwischen Stapelüberlauffehler und Speichermangel
Ist die Kurzschlussauswertung wirklich schnell? Unterschied zwischen && und & in Java
[Java] Unterschied zwischen == und gleich
Java-Implementierung von Tri-Tree
Vergleich von Versionszeichenfolgen, wenn Sie die Verarbeitung zwischen zwei Versionen verzweigen möchten (Java-Implementierung)
Erwägen Sie die Implementierung einer Methode, die die Differenz zwischen zwei Listen zurückgibt
Dies ist die Excel-Ausgabe in Java! Offizielle Dokumentübersetzung "JXLS"
[Java] Ordnen Sie die Daten des vergangenen Montags und Sonntags der Reihe nach an