Suche…


Erstellen von DTOs (POJOs / POCOs)

Datenklassen in Kotlin sind Klassen, die nur zum Halten von Daten erstellt wurden. Solche Klassen werden als data markiert:

data class User(var firstname: String, var lastname: String, var age: Int)

Der obige Code erstellt eine User Klasse mit der folgenden automatischen Generierung:

  • Getter und Setter für alle Eigenschaften (Getter nur für val )
  • equals()
  • hashcode()
  • toString()
  • copy()
  • componentN() (wobei N die entsprechende Eigenschaft in der Reihenfolge der Deklaration ist)

Wie bei einer Funktion können auch Standardwerte angegeben werden:

data class User(var firstname: String = "Joe", var lastname: String = "Bloggs", var age: Int = 20)

Weitere Details finden Sie hier Datenklassen .

Eine Liste filtern

val list = listOf(1,2,3,4,5,6)

//filter out even numbers

val even = list.filter { it % 2 == 0 }

println(even) //returns [2,4]

Delegieren Sie an eine Klasse, ohne diese im öffentlichen Konstruktor anzugeben

Angenommen, Sie möchten an eine Klasse delegieren, aber die an Klasse delegierte Klasse nicht im Konstruktorparameter angeben. Stattdessen möchten Sie es privat konstruieren, sodass der Konstruktor-Aufrufer es nicht bemerkt. Zunächst erscheint dies möglicherweise als unmöglich, da die Delegierung von Klassen nur die Übergabe an Konstruktorparameter zulässt. Es gibt jedoch eine Möglichkeit, wie in dieser Antwort beschrieben :

class MyTable private constructor(table: Table<Int, Int, Int>) : Table<Int, Int, Int> by table {

    constructor() : this(TreeBasedTable.create()) // or a different type of table if desired

}

Damit können Sie den Konstruktor von MyTable einfach so aufrufen: MyTable() . Die Table<Int, Int, Int> für die die MyTable Delegaten privat erstellt werden. Konstrukteur Anrufer weiß nichts davon.

Dieses Beispiel basiert auf dieser SO-Frage .

Serializable und serialVersionUid in Kotlin

Um die serialVersionUID für eine Klasse in Kotlin zu erstellen, serialVersionUID Ihnen einige Optionen zur Verfügung, die alle das Hinzufügen eines Members zum Companion-Objekt der Klasse umfassen.

Der prägnanteste Bytecode stammt aus einem private const val von private const val , der in der MySpecialCase Klasse eine private statische Variable wird, in diesem Fall MySpecialCase :

class MySpecialCase : Serializable {
    companion object {
        private const val serialVersionUID: Long = 123
    }
}

Sie können diese Formulare auch verwenden, wobei es jeweils einen Nebeneffekt auf Getter / Setter-Methoden gibt, die für die Serialisierung nicht erforderlich sind.

class MySpecialCase : Serializable {
    companion object {
        private val serialVersionUID: Long = 123
    }
}

Dadurch wird das statische Feld erstellt, es wird jedoch auch ein Getter für getSerialVersionUID für das Begleitobjekt erstellt, was nicht getSerialVersionUID ist.

class MySpecialCase : Serializable {
    companion object {
        @JvmStatic private val serialVersionUID: Long = 123
    }
}  

Dadurch wird das statische Feld erstellt, aber auch ein statischer Getter für getSerialVersionUID für die enthaltende Klasse MySpecialCase . MySpecialCase ist nicht MySpecialCase .

Alle funktionieren jedoch als Methode zum Hinzufügen der serialVersionUID zu einer Serializable Klasse.

Fließende Methoden in Kotlin

Fließende Methoden in Kotlin können mit Java identisch sein:

fun doSomething() {
   someOtherAction()
   return this
}

Sie können sie jedoch auch funktionaler machen, indem Sie eine Erweiterungsfunktion erstellen, z.

fun <T: Any> T.fluently(func: ()->Unit): T {
    func()
    return this
}

Das erlaubt dann offensichtlich offensichtlich fließende Funktionen:

fun doSomething() {
   return fluently { someOtherAction() }
}

Verwenden Sie let oder auch, um die Arbeit mit nullfähigen Objekten zu vereinfachen

let in Kotlin wird aus dem Objekt, zu dem es aufgerufen wurde, eine lokale Bindung erstellt. Beispiel:

val str = "foo"
str.let {
    println(it) // it
}  

Dadurch wird "foo" gedruckt und Unit .

Der Unterschied zwischen let und also ist , dass Sie einen beliebigen Wert von einer zurückgeben kann let Block. also in der anderen Hand wird die Unit immer reutrn.

Warum ist das nützlich, fragen Sie? Denn wenn Sie eine Methode aufrufen, die null und Sie nur Code ausführen möchten, wenn der Rückgabewert nicht null , können Sie let oder also so verwenden:

val str: String? = someFun()
str?.let {
    println(it)
}

Dieser Code führt den let Block nur aus let wenn str nicht null . Beachten Sie den null Sicherheitsoperator ( ? ).

Verwenden Sie "Apply", um Objekte zu initialisieren oder eine Methodenverkettung zu erreichen

Die Dokumentation von apply lautet wie folgt:

ruft den angegebenen Funktionsblock mit this Wert als Empfänger auf und gibt this Wert zurück.

Während das kdoc nicht so hilfreich ist apply ist das Anwenden tatsächlich eine nützliche Funktion. In den Begriffen von layman gilt apply , in welchem ​​Umfang this an das Objekt gebunden ist, für das Sie apply . Auf diese Weise können Sie Code sparen, wenn Sie mehrere Methoden für ein Objekt aufrufen müssen, die Sie später zurückgeben. Beispiel:

File(dir).apply { mkdirs() }

Dies ist das gleiche wie das Schreiben:

fun makeDir(String path): File {
    val result = new File(path)
    result.mkdirs()
    return result
}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow