[JAVA] Erstellen Sie eine temporäre Klasse mit new Object () {}

Einführung

Javas "Object" -Klasse ist eine sehr wichtige Klasse in der Oberklasse aller Klassen, aber ist es nicht selten, dass sie selbst "neu" ist? In diesem Artikel zeige ich Ihnen zwei Codebeispiele, bei denen "new Object ()" sinnvoll ist.

Definieren Sie eine Methode innerhalb einer Methode

Das folgende Codebeispiel ist im Kommentar "Implementierung einer Kombination von Mathematik in Java - Qiita" beschrieben. Diese Methode listet "k" -Kombinationen auf und gibt sie aus den "Daten" des String-Arrays zurück.

    static List<String[]> combination(String[] data, int k) {
        List<String[]> result = new ArrayList<String[]>();
        combination(data, 0, new String[k], 0, result);
        return result;
    }

    static void combination(String[] data, int di, String[] comb, int ci, List<String[]> result) {
        if (ci == comb.length) {
            result.add(comb.clone());
            return;
        }
        for ( ; di <= data.length - (comb.length - ci); di++) {
            comb[ci] = data[di];
            combination(data, di + 1, comb, ci + 1, result);
        }
    }

Es besteht aus zwei Methoden, die direkt von außen aufgerufen wird, ist die Kombination mit zwei Argumenten, und die Kombination mit fünf Argumenten wird intern verwendet. Die Kombination mit 5 Argumenten ruft sich selbst zurück, aber von den 5 Argumenten geben die 3 Argumente ("Daten", "Kamm", "Ergebnis") genau den gleichen Wert wie das Argument an. Wenn Java verschachtelte Methoden definieren kann, sollten Sie bei einem Rückrufaufruf nicht dieselben Argumente schreiben müssen. Leider können Sie Methoden nicht in Java verschachteln. Schreiben wir es also mit new Object () um.

    static List<String[]> combination(String[] data, int k) {
        int length = data.length;
        List<String[]> result = new ArrayList<String[]>();
        String[] comb = new String[k];
        new Object() {
            void combination(int di, int ci) {
                if (ci == k) {
                    result.add(comb.clone());
                    return;
                }
                for (; di <= length - (k - ci); di++) {
                    comb[ci] = data[di];
                    combination(di + 1, ci + 1);
                }
            }
        }.combination(0, 0);
        return result;
    }

Die 5-Argument-Kombination wird in das neue Object () {} geschrieben und die festen 3 Argumente (Daten, Kamm, Ergebnis) werden gelöscht. Das new Object () {} in diesem Code definiert eine anonyme innere Klasse und erstellt gleichzeitig eine Instanz dieser Klasse. Die .combination (0, 0) nach dem neuen Object () {} ruft die in der inneren Klasse definierte Kombination (int di, int ci) auf. Die festen 3 Variablen ("Daten", "Kamm", "Ergebnis") können innerhalb der inneren Klasse referenziert werden, sodass sie nicht für jeden Aufruf als Argumente übergeben werden müssen. Ich erstelle eine nutzlose Instanz mit "new Object ()", aber der Overhead ist gering, da ich nur eine erstelle. Der Stapelverbrauch wird reduziert, da der Rückrufaufruf weniger Argumente enthält.

Klasse zur temporären Datenspeicherung

Angenommen, Sie haben eine Klasse wie diese:

public class Person {

    private final String name;
    private final String age;

    public Person(String name, String age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return this.name;
    }

    public String getAge() {
        return this.age;
    }
}

Angenommen, Sie haben die folgende Liste von "Personen".

List<Person> list = List.of(
    new Person("Yamada", "18"),
    new Person("Ichikawa", "72"),
    new Person("Sato", "39"),
    new Person("Tanaka", "9"));

Sortieren Sie dies nach "Alter" in aufsteigender Reihenfolge. Da age eine Zeichenfolge ist, muss sie so geschrieben werden, um sie als Ganzzahl zu sortieren.

    List<Person> result = list.stream()
        .sorted(Comparator.comparingInt(p -> Integer.parseInt(p.getAge())))
        .collect(Collectors.toList());

Dies funktioniert gut, ist aber nicht sehr effizient, da es bei jedem Vergleich von Werten zweimal "Integer.parseInt (p.getAge ())" ausführt. Selbst mit dem schnellen Sortieralgorithmus wird Integer.parseInt $ 2n \ log n $ mal ausgeführt.

Map.Entry

Das Koppeln einer Instanz von "Person" mit einer ganzzahligen Version von "Alter" löst dieses Problem. In solchen Fällen wird die Klasse "Map.Entry" häufig als temporärer Speicherort verwendet.

    List<Person> result = list.stream()
        .map(p -> Map.entry(Integer.parseInt(p.getAge()), p))
        .sorted(Comparator.comparingInt(Entry::getKey))
        .map(Entry::getValue)
        .collect(Collectors.toList());

Die Ganzzahl age muss nur einmal berechnet werden, es ist jedoch nicht intuitiv klar, wo Map.Entry verwendet wird.

Records Java 14 fügt eine Funktion namens Records hinzu, mit der sich unveränderliche Klassen für die Datenspeicherung leicht definieren lassen. Wenn Sie dies verwenden, wird es so sein.

    record PersonWithAge(Person p, int age) {
        PersonWithAge(Person p) {
            this(p, Integer.parseInt(p.getAge()));
        }
    }

    List<Person> result = list.stream()
        .map(PersonWithAge::new)
        .sorted(Comparator.comparingInt(PersonWithAge::age))
        .map(PersonWithAge::p)
        .collect(Collectors.toList());

Es ist leichter zu verstehen, aber es fühlt sich auch etwas übertrieben an, weil es eine Klasse für die temporäre Speicherung definiert.

new Object() Dies passiert, wenn Sie "new Object ()" verwenden.

    List<Person> result = list.stream()
        .map(p -> new Object() {
            int intAge = Integer.parseInt(p.getAge());
            Person person = p;
        })
        .sorted(Comparator.comparingInt(obj -> obj.intAge))
        .map(obj -> obj.person)
        .collect(Collectors.toList());

new Object () {...} ist ein temporärer Speicherort, der nur in diesem Ausdruck gültig ist. Obwohl es sich um eine unbenannte Klasse handelt, wird sie in diesem Ausdruck als vollwertige Klasse mit den Feldern "intAge" und "person" erkannt.

Zusammenfassung

Wie war das? Sie können sehen, dass die Object-Klasse auch verschiedene Verwendungszwecke hat. Ich kann es nicht empfehlen, weil es sich schwierig anfühlt, aber ich benutze es, seit ich wusste, dass ich es so schreiben kann.

Recommended Posts

Erstellen Sie eine temporäre Klasse mit new Object () {}
[Rails6] Erstelle eine neue App mit Rails [Anfänger]
[Rails 5] Erstelle eine neue App mit Rails [Anfänger]
[Android] Erstellen Sie eine neue Klasse, indem Sie ImageView erben
[Rails] Rails neu, um eine Datenbank mit PostgreSQL zu erstellen
Erstellen Sie einen Spielplatz mit Xcode 12
Zuordnung zu einer Klasse mit einem Wertobjekt in How to My Batis
Erstellen Sie mit JAVA eine unveränderliche Klasse
Erstellen Sie mit Docker eine Vue3-Umgebung!
Erstellen Sie eine neue App mit Rails
Erstellen Sie Ausnahmen mit einer Fluid-Schnittstelle
Erstellen Sie ein Maven-Projekt mit Befehlen
Ich kann in IntelliJ keine Java-Klasse mit einem bestimmten Namen erstellen
Lassen Sie uns eine Instanz mit .new selbst erstellen. .. ..
Erstellen Sie mit dem Befehl eine JAR-Datei
Erstellen Sie mit Dropwizard eine einfache Webanwendung
[Schienenentnahme] Erstellen Sie eine einfache Entnahmefunktion mit Schienen
[Memo] Erstellen Sie mit Docker ganz einfach eine CentOS 8-Umgebung
Erstellen Sie mit Spring Boot eine einfache Such-App
Erstellen Sie eine CSR mit erweiterten Informationen in Java
Erstellen Sie mit Java + MySQL ein einfaches Bulletin Board
[Windows] [IntelliJ] [Java] [Tomcat] Erstellen Sie mit IntelliJ eine Umgebung für Tomcat 9
Lassen Sie uns mit Javas Timer einen zeitgesteuerten Prozess erstellen! !!
[Rails] Rails neu, um eine Datenbank mit PostgreSQL zu erstellen
[Java] Erstellen Sie eine Sammlung mit nur einem Element
So erstellen Sie eine Klasse, die Klasseninformationen erbt
Erstellen Sie einen Team-Chat mit Rails Action Cable
Erstellen Sie ein SandBox-Konto mit Fastlane Spaces IP
Erstellen Sie eine Mehrschlüsselkarte mit einer Standardbibliothek
[Java] Objektklasse
Erstellen Sie einen Web-API-Server mit Spring Boot
Erstellen Sie mit Docker eine Spring Boot-Entwicklungsumgebung
Erstellen einer EC-Site mit Rails 5 ⑨ ~ Erstellen einer Warenkorbfunktion ~
So löschen Sie ein mit Rails erstelltes new_record-Objekt
Erstellen Sie eine Vorlage für das iOS14-Widget mit Absichtskonfiguration.
Erstellen Sie eine Chat-App mit WebSocket (Tyrus) + libGDX + Kotlin
Wenn es einen Statusübergang gibt, erstellen wir eine Statusklasse
[Maschinelles Lernen] Ich habe die Objekterkennung mit Create ML [Objekterkennung] ausprobiert.
[Hinweis] Erstellen Sie mit Docker eine Java-Umgebung von Grund auf neu
Erstellen Sie einen Service mit einem leeren Modell Liferay 7.0 / DXP
Erstellen Sie mit Spring Security 2.1 eine einfache Demo-Site mit Spring Security
Ein Memo, das eine Klasse behandelt, die unabhängig mit ArrayList erstellt wurde
[Java] So unterbrechen Sie eine Zeile mit StringBuilder
Versuchen Sie es mit Trailblazer
[Java] Erstellen Sie einen Filter
Neuer Mitarbeiter hat versucht, mit Spring Security eine Authentifizierungs- / Autorisierungsfunktion von Grund auf neu zu erstellen
Ich habe versucht, mit Chocolatey eine Java8-Entwicklungsumgebung zu erstellen
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 1
Erstellen Sie ein Seitensteuerelement, das mit RecyclerView verwendet werden kann
Erstellen Sie ein Docker-Image mit installiertem Oracle JDK (yum
[Rails] Ich habe versucht, eine Mini-App mit FullCalendar zu erstellen
Erstellen Sie eine Hello World-Webanwendung mit Spring Framework + Jetty
Erstellen Sie einen SlackBot mit AWS Lambda & API Gateway in Java
Eine Reihe von Schritten zum Erstellen von Ergebnissen für Portfolios mit Rails
So verschieben Sie eine andere Klasse mit einer Schaltflächenaktion einer anderen Klasse.
Bis Sie eine Webanwendung mit Servlet / JSP erstellen (Teil 1)
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 2