Поиск…
Создание DTO (POJO / POCOs)
Классы данных в kotlin - это классы, созданные только для хранения данных. Такие классы отмечены как data
:
data class User(var firstname: String, var lastname: String, var age: Int)
В приведенном выше коде создается класс User
со следующими автоматически генерируемыми:
- Getters и Setters для всех свойств (getters только для
val
s) -
equals()
-
hashcode()
-
toString()
-
copy()
-
componentN()
(гдеN
- соответствующее свойство в порядке объявления)
Так же, как и для функции, значения по умолчанию также могут быть указаны:
data class User(var firstname: String = "Joe", var lastname: String = "Bloggs", var age: Int = 20)
Более подробную информацию можно найти здесь « Классы данных» .
Фильтрация списка
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]
Делегировать в класс, не предоставляя его в публичном конструкторе
Предположим, вы хотите делегировать класс, но вы не хотите предоставлять делегированный класс в параметре конструктора. Вместо этого вы хотите создать его конфиденциально, заставив вызывающего абонента конструктора не знать об этом. Сначала это может показаться невозможным, поскольку делегирование классов позволяет делегировать только параметры конструктора. Однако есть способ сделать это, как указано в этом ответе :
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
}
С этим вы можете просто вызвать конструктор MyTable
следующим образом: MyTable()
. Table<Int, Int, Int>
с которой делегаты MyTable
будут создаваться конфиденциально. Консоль конструктора ничего не знает об этом.
Этот пример основан на этом вопросе SO .
Сериализуемый и serialVersionUid в Котлине
Чтобы создать serialVersionUID
для класса в Kotlin, у вас есть несколько вариантов, связанных с добавлением члена к сопутствующему объекту класса.
Самый сжатый байт-код исходит из private const val
который станет частной статической переменной в содержащем классе, в этом случае MySpecialCase
:
class MySpecialCase : Serializable {
companion object {
private const val serialVersionUID: Long = 123
}
}
Вы также можете использовать эти формы, каждый из которых имеет побочный эффект от методов getter / setter, которые не нужны для сериализации ...
class MySpecialCase : Serializable {
companion object {
private val serialVersionUID: Long = 123
}
}
Это создает статическое поле, но также создает getter, а также getSerialVersionUID
на сопутствующем объекте, который не нужен.
class MySpecialCase : Serializable {
companion object {
@JvmStatic private val serialVersionUID: Long = 123
}
}
Это создает статическое поле, но также создает статический getter, а getSerialVersionUID
в содержащем классе MySpecialCase
который не нужен.
Но все они работают как метод добавления serialVersionUID
в класс Serializable
.
Свободные методы в Котлине
Свободные методы в Котлине могут быть такими же, как Java:
fun doSomething() {
someOtherAction()
return this
}
Но вы также можете сделать их более функциональными, создав функцию расширения, такую как:
fun <T: Any> T.fluently(func: ()->Unit): T {
func()
return this
}
Которая затем позволяет более явно бегло выполнять функции:
fun doSomething() {
return fluently { someOtherAction() }
}
Используйте let или также для упрощения работы с объектами с нулевым значением
let
in Kotlin создает локальную привязку с объекта, на который он был вызван. Пример:
val str = "foo"
str.let {
println(it) // it
}
Это напечатает "foo"
и вернет Unit
.
Разница между let
и also
заключается в том, что вы можете вернуть любое значение из блока let
. also
в другой руке всегда будет единица Unit
.
Теперь почему это полезно, спросите вы? Потому что, если вы вызываете метод, который может возвращать значение null
и вы хотите запустить некоторый код только тогда, когда это возвращаемое значение не является null
вы можете использовать let
или also
как это:
val str: String? = someFun()
str?.let {
println(it)
}
Эта часть кода будет запускать только блок let
когда str
не является null
. Обратите внимание на null
оператор безопасности ( ?
).
Использование применяется для инициализации объектов или для достижения цепочки методов
В документации по apply
говорится следующее:
вызывает указанный функциональный блок с
this
значением в качестве приемника и возвращаетthis
значение.
В то время как kdoc не так полезно apply
это действительно полезная функция. При apply
условий неспециалиста устанавливает область, в которой this
связано с объектом, на который вы apply
. Это позволяет вам сэкономить некоторый код, когда вам нужно вызвать несколько методов для объекта, который вы затем вернете позже. Пример:
File(dir).apply { mkdirs() }
Это то же самое, что написать это:
fun makeDir(String path): File {
val result = new File(path)
result.mkdirs()
return result
}