Szukaj…


Tworzenie DTO (POJO / POCO)

Klasy danych w kotlin to klasy tworzone wyłącznie w celu przechowywania danych. Takie klasy są oznaczone jako data :

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

Powyższy kod tworzy klasę User z automatycznie generowanymi następującymi elementami:

  • Getters and Setters dla wszystkich właściwości (getters tylko dla val )
  • equals()
  • hashcode()
  • toString()
  • copy()
  • componentN() (gdzie N jest odpowiednią właściwością w kolejności deklaracji)

Podobnie jak w przypadku funkcji, można również określić wartości domyślne:

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

Więcej informacji można znaleźć tutaj Klasy danych .

Filtrowanie listy

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]

Deleguj do klasy, nie udostępniając jej w konstruktorze publicznym

Załóżmy, że chcesz delegować do klasy, ale nie chcesz podawać klasy delegowanej do w parametrze konstruktora. Zamiast tego chcesz zbudować go prywatnie, aby wywołujący konstruktor nie był tego świadomy. Na początku może się to wydawać niemożliwe, ponieważ delegowanie klas umożliwia delegowanie tylko parametrów konstruktora. Istnieje jednak sposób, aby to zrobić, jak podano w tej odpowiedzi :

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

}

Dzięki temu możesz po prostu wywołać konstruktor MyTable : MyTable() . Table<Int, Int, Int> do której MyTable prywatne MyTable zostaną utworzone prywatnie. Dzwoniący konstruktor nic o tym nie wie.

Ten przykład jest oparty na tym pytaniu SO .

Serializable and serialVersionUid w Kotlin

Aby utworzyć serialVersionUID dla klasy w Kotlin, masz kilka opcji obejmujących dodanie członka do obiektu towarzyszącego klasy.

Najbardziej zwięzły kod bajtowy pochodzi z private const val która stanie się prywatną zmienną statyczną w klasie zawierającej, w tym przypadku MySpecialCase :

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

Możesz również użyć tych formularzy, z których każdy ma efekt uboczny posiadania metod getter / setter, które nie są konieczne do serializacji ...

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

Tworzy to pole statyczne, ale także getter oraz getSerialVersionUID na obiekcie towarzyszącym, co jest niepotrzebne.

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

Tworzy to pole statyczne, ale także tworzy getter statyczny oraz getSerialVersionUID na zawierającej klasę MySpecialCase co jest niepotrzebne.

Ale wszystkie działają jako metoda dodania serialVersionUID do klasy Serializable .

Płynne metody w Kotlinie

Płynne metody w Kotlin mogą być takie same jak Java:

fun doSomething() {
   someOtherAction()
   return this
}

Ale możesz też uczynić je bardziej funkcjonalnymi, tworząc funkcję rozszerzenia, taką jak:

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

Który następnie pozwala na bardziej płynne funkcje:

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

Użyj let lub również, aby uprościć pracę z obiektami zerowalnymi

let Kotlin tworzy lokalne powiązanie z obiektu, do którego został wywołany. Przykład:

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

Spowoduje to wydrukowanie "foo" i zwróci Unit .

Różnica między let a also polega na tym, że możesz zwrócić dowolną wartość z bloku let . also z drugiej strony zawsze będzie odnawiać Unit .

Dlaczego to jest przydatne, pytasz? Ponieważ jeśli wywołasz metodę, która może zwrócić null i chcesz uruchomić kod tylko wtedy, gdy ta zwracana wartość nie jest null , możesz użyć let lub also następujący sposób:

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

Ten fragment kodu uruchomi blok let wtedy, gdy str nie ma null . Zwróć uwagę na null operator bezpieczeństwa ( ? ).

Użyj zastosować, aby zainicjować obiekty lub uzyskać łańcuch metod

Dokumentacja apply mówi co następuje:

wywołuje określony blok funkcyjny z this wartością jako odbiornikiem i zwraca this wartość.

Chociaż kdoc nie jest tak pomocny, apply jest rzeczywiście przydatną funkcją. W laika apply ustala zakres, w którym this jest związany z obiektu, który nazywany apply dalej. Dzięki temu możesz zaoszczędzić trochę kodu, gdy musisz wywołać wiele metod na obiekcie, który później zwrócisz. Przykład:

File(dir).apply { mkdirs() }

To jest tak samo jak pisanie tego:

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow