Kotlin
Frazeologia
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()
(gdzieN
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 zwracathis
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
}