Памятка по Kotlin
Опубликовано 29 May 2022
Хорошие ссылки
Разный кусок кода
map reduce
Преобразовать один список бит в один список строк и резюмировать список строк
в строке, содержащей конкатенацию. Как залогировать запрос, отправленный (requestBodyContent:byte[])
log.info(
requestBodyContent!!.map { it.toInt().toChar().toString() }
.reduce { request: String, s: String -> request + s }
)
enum и sealed-классы
функциональный интерфейс и ссылка на метод
Можно преобразовать сущность в модель домена DTO с помощью метода-ссылки (функциональный стиль- java 8)
fun findAllByLoginNot(
pageable:Pageable,
login:String)
:Page<UserDto> {
return userDao.findAllByLoginNot(
pageable,
login).map(::fromEntity)
}
однаhttps://stackoverflow.com/a/22245383/837404[хорошее объяснение]
Захватить стандартный вывод
package functional
import java.io.ByteArrayOutputStream
import java.io.PrintStream
import java.lang.System.out
import java.lang.System.setOut
import kotlin.test.AfterTest
import kotlin.test.BeforeTest
import kotlin.test.Test
import kotlin.test.assertEquals
class BasicsHOF {
private val standardOut: PrintStream? = out
private val outputStreamCaptor = ByteArrayOutputStream()
@BeforeTest
fun setUp() = setOut(PrintStream(outputStreamCaptor))
@AfterTest
fun tearDown() = setOut(standardOut)
@Test
fun `three times dope`() {
3.times { println("Hello") }
assertEquals(
buildString {
repeat(3) { append("Hello\n") }
deleteAt(length - 1)
}, outputStreamCaptor
.toString()
.trim()
)
}
fun Int.times(fn: () -> Unit) = (1..this).forEach { _ -> fn() }
}
Чем в Kotlin отличаются apply, run, let, also, use и with ?
Сравнение функций Kotlin и использование форм лямбда Reference
применить
run, let, also, use, et `with`Предлагают разные способы обработки объектов. Каждая имеет свои варианты использования и поведение. Кроме того, формы ссылок на лямбда позволяют сделать код более читаемым и повторно используемым, ссылаясь на существующие лямбда-функции.Функция`apply`используется для настройки объекта во время его создания. Она возвращает объект, на котором она вызывается.
Пример со ссылкой на lambda :
val someObject = SomeClass().apply(::configureObject)
Пример с lambda :
val someObject = SomeClass().apply {
// configuration des propriétés de someObject
}
run
Функция`run`используется для выполнения блока кода над объектом и возвращает результат блока кода.
Пример с lambda reference :
val result = someObject.run(::someFunction)
Пример с lambda :
val result = someObject.run {
// bloc de code à exécuter sur someObject
// la dernière expression est renvoyée
}
laissez
Функция`let`используется для выполнения блока кода над объектом и возвращает результат блока кода.
Пример со ссылкой на lambda
val result = someObject.let(::processObject)
Пример с lambda :
val result = someObject.let {
// bloc de code à exécuter sur someObject
// la dernière expression est renvoyée
}
также
Функция`also`используется для выполнения дополнительного действия с объектом и возвращает объект, на котором она вызывается.
Пример с lambda reference :
someObject.also(::performAdditionalAction)
Пример с lambda :
someObject.also {
// action additionnelle sur someObject
}
use
Функция`use`используется для работы с ресурсами, которые должны быть закрыты после использования. Она автоматически вызывает функцию`close`в конце блока.
Пример с лямбда-ссылкой :
someResource.use(::useResource)
Пример с lambda :
someResource.use {
// travailler avec la ressource
}
с
Функция`with`используется для вызова нескольких методов у объекта без повторения его имени и возвращает результат последнего выражения.
Пример с lambda reference :
val result = with(someObject, ::processWithObject)
Пример с lambda :
val result = with(someObject) {
// appeler des méthodes sur someObject
// la dernière expression est renvoyée
}
Используя формы lambda reference или блоки`{}`, вы можете инкапсулировать логику в отдельные функции, тем самым улучшая читаемость и переиспользуемость кода.
let Function в Kotlin
Функция`let`В Kotlin используется для выполнения операций над объектом и возврата другого результата. Однако важно отметить, что функция`let`не изменяет начальное состояние объекта, на котором она вызывается
| Подпись | inline fun <T, R> T.let(block: (T) → R): R |
|---|
| использование | Функция`let`Обычно используется для применения преобразований к объекту и получения результата, основанного на этих преобразованиях. |
|---|
| Результат | Значение, возвращаемое функцией`let`является результатом лямбда-выражения, переданного в качестве аргумента, обычно результатом операций, выполненных над объектом. |
|---|
| Пограничные эффекты | Хотя функция`let`может иметь побочные эффекты на объекте, когда она используется в лямбда-выражении, она не изменяет исходное состояние самого объекта |
|---|
Таким образом, функция`let`является элегантным способом выполнять операции над объектом, одновременно получая производный результат, сохраняя при этом целостность исходного объекта.