Created
October 26, 2021 07:49
-
-
Save eutkin/8a9e16d7905ef52ce3019744fac4ba31 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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