Schön, Sie kennenzulernen. Mein Name ist @ekuro und ich mache einen Arbeitsverwaltungsdienst namens Gozal. Bei Gozal führen wir eine domänengesteuerte Entwicklung durch, um das Arbeitsmanagement besser in die Software zu integrieren. Wir sind ständig auf der Suche nach besseren und vielseitigeren Klassen, damit wir leicht auf Änderungen in Geschäftsprozessen aufgrund von Reformen des Arbeitsstils reagieren können.
Dieses Mal dachte ich darüber nach, was ich verwenden und wo ich definieren soll, um die Liste der Mitarbeiter nach der Mitarbeiternummer zu sortieren.
Betrachten Sie den Prozess des Sortierens der Liste der Mitarbeiter "Liste
Employee.java
@Getter
@AllArgsConstructor
public class Employee {
//Mitarbeiternummer
private EmployeeNumber number;
//Persönliche Informationen wie Name und Geburtsdatum
private Personal personal;
}
@Getter
@AllArgsConstructor
public class EmployeeNumber {
private String number;
}
Typische Methoden zum Sortieren von Objekten in Java 8 sind Collections.sort und die Sorted-Methode der Stream-API.
Wenn Sie Sammlungen verwenden, müssen Sie eine der beiden folgenden Arten von Sortiermethoden verwenden.
public static <T extends Comparable<? super T>> void sort(List<T> list) {
list.sort(null);
}
public static <T> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}
Bei Verwendung der Stream-API stehen außerdem zwei Arten von Methoden zur Verfügung.
Stream<T> sorted();
Stream<T> sorted(Comparator<? super T> comparator);
In beiden Fällen muss bei Verwendung der ersten Methode die zu sortierende Klasse Compareable implementieren, und bei Verwendung der zweiten Methode wird der Funktionsschnittstellenkomparator
Sowohl Comparable als auch Comparator sind Klassen, die Größenvergleiche definieren. Schauen wir uns jedoch zunächst die Unterschiede an.
Comparable ist eine Schnittstelle, in der nur "public int compareTo (To);" definiert ist. Durch Erben von Compareable mit dem Objekt, das Sie vergleichen möchten, und Implementieren von compareTo können Sie definieren, wie dieses Objekt verglichen werden soll. Die compareTo-Methode vergleicht sich mit dem Argument. Andererseits definiert die Comparator-Schnittstelle eine Methode mit zwei Argumenten: "int compare (To1, To2);". Da Sie für die zu vergleichenden Objekte mehrere Komparatoren implementieren können, ist dies hilfreich, wenn Sie die Sortierung nach verschiedenen Schlüsseln definieren möchten.
Betrachten Sie den Fall der Employee-Klasse. Die Mitarbeiterklasse enthält neben der Mitarbeiternummer auch persönliche Informationen wie den Namen. Daher ist es in Zukunft möglich, nach verschiedenen Informationen zu sortieren. Daher ist es besser, für jedes zu vergleichende Element einen Vergleicher zu erstellen, als Compareable in der Employee-Klasse zu erben.
Schreiben wir eine Methode, die tatsächlich einen Composer zurückgibt, um die Mitarbeiterliste nach Mitarbeiternummer zu sortieren. [^ 1]
Employee.java
@Getter
@AllArgsConstructor
public class Employee {
//Mitarbeiternummer
private EmployeeNumber number;
//Persönliche Informationen wie Name und Geburtsdatum
private Personal personal;
public static Comparator<Employee> orderByNumber() {
return Comparator.comparing(
//Einfacher Vergleich von Mitarbeiternummernzeichenfolgen
(Employee employee) -> employee.getNumber().getNumber());
}
}
Wenn Sie tatsächlich sortieren
List<Employee> employees = ~;
Collections.sort(employees, Employee.orderByNumber());
Kann geschrieben werden.
Im obigen Beispiel ist die Vergleichsmethode "orderByNumber ()" in der Employee-Klasse definiert. Der Vergleich von Mitarbeiternummern ist jedoch von Natur aus eine Eigenschaft, die Mitarbeiternummernklassen haben sollten. Verschieben Sie die Vergleichsmethode in die EmployeeNumber-Klasse.
Employee.java
@Getter
@AllArgsConstructor
public class Employee {
//Mitarbeiternummer
private EmployeeNumber number;
//Persönliche Informationen wie Name und Geburtsdatum
private Personal personal;
public static Comparator<Employee> orderByNumber() {
//Mit EmployeeNumber als Vergleichsschlüssel wird der Sortiervorgang der Bestellmethode EmployeeNumber überlassen.
return Comparator.comparing(Employee::getNumber, EmployeeNumber.order());
}
}
EmployeeNumber.java
@Getter
@AllArgsConstructor
public class EmployeeNumber {
private String number;
public static Comparator<EmployeeNumber> order() {
return Comparator.comparing(EmployeeNumber::getNumber);
}
}
Die Vergleichsverarbeitungsmethode wurde mit EmployeeNumber abgeschlossen, wodurch sie zu einer vielseitigeren Klasse wurde. Diesmal ist der Größenvergleichsprozess von EmployeeNumber eine einfache Logik. Wenn jedoch Zahlen und Zeichenfolgen gemischt werden, wird dies zu einem etwas komplizierten Prozess. In diesem Fall ist es besser, einen Vergleichsprozess in EmployeeNumber zu definieren.
Da für ein Objekt mehrere Komparatoren definiert werden können, ist es einfach, sie häufig zu verwenden. Überprüfen Sie also, ob Sie Comparer verwendet haben, wo Sie Comparable erben sollten.
Es scheint, dass die Sortierung der Mitarbeiternummer dieses Mal in Zukunft nicht mehr nach der Nummer sortiert wird. Daher ist es besser, Comparable für die Verarbeitung des Vergleichs von Mitarbeiternummern zu verwenden.
Employee.java
@Getter
@AllArgsConstructor
public class Employee {
//Mitarbeiternummer
private EmployeeNumber number;
//Persönliche Informationen wie Name und Geburtsdatum
private Personal personal;
public static Comparator<Employee> orderByNumber() {
//EmployeeNumber implementiert Comparable, wodurch die Anzahl der Argumente reduziert wird.
return Comparator.comparing(Employee::getNumber);
}
}
EmployeeNumber.java
@Getter
@AllArgsConstructor
public class EmployeeNumber implements Comparable<EmployeeNumber> {
private String number;
@Override
public int compareTo(@Nonnull EmployeeNumber other) {
return this.number.compareTo(other.number);
}
}
Durch das Erben von Comparable von EmployeeNumber wird eine unnötige Beschreibung vermieden und der Verarbeitungsinhalt verfeinert.
Wenn Sie die entsprechende Verarbeitung auf diese Weise an die entsprechende Stelle schreiben, können Sie in Zukunft problemlos auf Anfragen wie "Ich möchte nach Namen sortieren" und "Ich möchte nach Geburtstag sortieren" reagieren.
Wir glauben, dass ein besseres Verständnis von Konzepten und das Entwerfen von Klassen nicht nur die Implementierung und Bereitstellung von leicht verständlichem Quellcode erleichtert, sondern auch zur Entdeckung komplexerer neuer Geschäftsabläufe führt.
Bei Gozal werden wir uns daran halten, das Konzept zu verstehen, um eine neue Arbeitserfahrung zu schaffen, die die Welt durch die Entsendung von Ingenieuren atemberaubend macht.
Rekrutierung von Ingenieuren aus der Welt des Arbeitsmanagements, um unnötige Handarbeit zu vermeiden! Rekrutierung von Frontingenieuren zur Schaffung eines SaaS!
[^ 1]: Die in der Comparator-Schnittstelle bereitgestellte statische Vergleichsmethode verwendet Function als Argument und vergleicht das Ergebnis von Function mit compareTo, wenn nur ein Argument vorhanden ist.
Recommended Posts