Поиск…


Создание 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
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow