Skip to content

Instantly share code, notes, and snippets.

@eutkin
Created October 26, 2021 07:49
Show Gist options
  • Save eutkin/8a9e16d7905ef52ce3019744fac4ba31 to your computer and use it in GitHub Desktop.
Save eutkin/8a9e16d7905ef52ce3019744fac4ba31 to your computer and use it in GitHub Desktop.
fun main() {
// val --> неизменяемая ссылка на объект (в нашем случае объект типа Function
// transformer --> имя переменной aka имя ссылки на объект
// : --> разделяет имя переменной и ее тип
// (Int) -> String --> тип переменной, функция, принимающая (в скобочках) целое число (тип Int) и возвращающая (после стрелочки) строковый тип (String)
// = --> оператор присвоения значения переменной
// { .. } --> содержат функцию целиком
// element : Int --> аргумент функции с именем element и типом Int
// -> --> разделяет аргументы функции с телом функции
// "a$element" --> тело функции, в данном случае преобразование element в строку
val transformer: (Int) -> String = { element: Int -> "a$element" }
val container = Container(listOf(1, 2, 3))
/*
flatMap
Принимает функцию, возвращающую другой контейнер такого же типа, и возвращает новый контейнер
с элементами обоих контейнеров
Ожидаемый результат: [1, 2, 3, 4, 2, 3, 4, 3, 4]
*/
// (element..4).toList() – означает, что мы составляем список от значения переменной элемент до 4 включительно.
// Например, если element = 2, то список будет содержать [2, 3, 4]
container.flatMap { element: Int -> Container((element..4).toList()) }.println()
/*
filter
Принимает предикат и возвращает новый контейнер с теми элементами текущего, которые соответствуют предикату
(предикат для этого элемента возвращает true)
Ожидаемый результат: [3]
*/
container.filter { element -> element > 2 }.println()
/*
* mapNotNull
*
* Принимает функцию трансформер, которая принимает элемент контейнера и возвращает элемент другого типа.
* Если функция-трансформер возвращает null, то в итоговый контейнер это не попадает
*
* Ожидаемый результат: [2]
*/
container.mapNotNull { element -> if (element % 2 == 0) element.toString() else null }.println()
/*
joinToString, возвращает строку
Объединяет все элементы в строку. Принимает 4 аргумента:
- prefix – начало итоговой строки
- postfix - конец итоговой строки
- delimeter - разделитель
- transformer - функция преобразования
Ожидаемый результат: Start element1, element2, element3.
*/
println(container.joinToString(prefix = "Start", postfix = ".", delimeter = ", ") { element -> "element$element" })
}
/**
* Контейнер для хранения списка значений.
*
* @param T обобщенный параметр, хранящегося значения. Точную форму принимает после создания объекта из этого класса
* @param list список значений для хранения с типом T
*/
class Container<T>(private var list: List<T>) {
/**
* Функция высшего порядка. Отличается от обычной функции тем,
* что принимает как аргумент другую функцию.
*
* В данном случае, используется для изменения каждого элемента в контейнере,
* не давая доступ к приватному полю list.
* @param U обобщенный тип (как и T), в который будет преобразован с помощью transformer каждый элемент внутри контейнера
* @param transformer функция, преобразующая каждое значение типа T в тип U
* @return новый контейнер, который хранит преобразованные значения
*/
fun <U> map(transformer: (T) -> U): Container<U> {
val buffer = mutableListOf<U>()
for (element in this.list) {
buffer += transformer(element)
}
return Container(buffer)
}
/**
* Печатает экран содержимое контейнера.
*/
fun println() {
println(this.list)
}
override fun toString(): String {
return "$list"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment