functional
Содержит функции для работы с данными в функциональном стиле
Константы
IDENTITY
: function = def(x) = x
функция, которая возвращает переданный в неё аргумент
Функции
chain(data, functions...)
combine(functions...)
— комбинирует функции (композиция)
use functional
def f1() = 2
def f2(a) = a*2
def f3(a) = a/4
f = combine(::f1, ::f2, ::f3)
println f() // 1
// равносильно
f = def() = f3(f2(f1()))
println f() // 1
dropwhile(data, predicate)
— пропускает элементы пока функция-предикат возвращает true
filter(data, predicate)
— фильтрует массив или объект и возвращает массив только с теми элементами, которые удовлетворяют предикату predicate
.
predicate
- функция которая принимает один (для массивов) и два (для объектов) аргумента
use functional
nums = [1,2,3,4,5]
print filter(nums, def(x) = x % 2 == 0) // [2, 4]
flatmap(array, mapper)
— преобразует каждый элемент массива в массив элементов
use functional
nums = [1,2,3,4]
print flatmap(nums, def(x) {
arr = newarray(x)
for i = 0, i < x, i++
arr[i] = x
return arr
}) // [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
foreach(data, consumer)
— для каждого элемента в массиве или объекте data
вызывает функцию consumer
Если data
- массив, то в функции consumer
необходим один параметр, если объект - два (ключ и значение).
use functional
foreach([1, 2, 3], def(v) { print v })
foreach({"key": 1, "key2": "text"}, def(key, value) {
print key + ": " + value
})
map(data, mapper...)
— преобразует элементы массива или объекта.
Если data
- массив, то функция mapper
преобразует значения, если объект - необходимо передать две функции: keyMapper
- преобразует ключи и valueMapper
- преобразует значения
use functional
nums = [3,4,5]
print map(nums, def(x) = x * x) // [9, 16, 25]
reduce(data, identity, accumulator)
— преобразует элементы массива или объекта в одно значение, например сумма элементов или объединение в строку.
Если data
- массив, то в функции accumulator
необходим один параметр, если объект - два (ключ и значение)
use functional
nums = [1,2,3,4,5]
print reduce(nums, 0, def(x, y) = x + y) // 15
sortby(array, function)
— сортирует элементы массива или объекта по данным в функции function
use functional
data = [
{"k1": 2, "k2": "x"},
{"k1": 7, "k2": "d"},
{"k1": 4, "k2": "z"},
{"k1": 5, "k2": "p"},
]
println sortby(data, def(v) = v.k1) // [{k1=2, k2=x}, {k1=4, k2=z}, {k1=5, k2=p}, {k1=7, k2=d}]
println sortby(data, def(v) = v.k2) // [{k1=7, k2=d}, {k1=5, k2=p}, {k1=2, k2=x}, {k1=4, k2=z}]
groupby(data, function)
2.0.0 — группирует элементы массива или объекта на основе результата функции function
use functional
data = [
{"k1": 2, "k2": "x"},
{"k1": 4, "k2": "z"},
{"k1": 5, "k2": "p"},
]
println groupby(data, def(e) = e.k1) // {"2"=[{k1=2, k2=x}], "4"=[{k1=4, k2=z}], "5"=[{k2=p, k1=5}]}
println groupby(data, def(e) = e.k2) // {"x"=[{k1=2, k2=x}], "z"=[{k1=4, k2=z}], "p"=[{k2=p, k1=5}]}
tomap(data, keyMapper, valueMapper = def(v) = v, merger = def(oldValue, newValue) = newValue)
2.0.0 — преобразует элементы массива или объекта в объект, основываясь на результате функций keyMapper
и valueMapper
. Функция merger
используется для разрешения коллизий
use functional
data = ["apple", "banana"]
println tomap(data, def(str) = str.substring(0, 1)) // {"a": "apple", "b": "banana"}
println tomap(data, def(str) = str.substring(0, 1), ::toUpperCase) // {"a": "APPLE", "b": "BANANA"}
stream(data)
— создаёт stream из данных и возвращает StreamValue
takewhile(data, predicate)
— собирает элементы пока функция-предикат возвращает true
Типы
StreamValue
Функции
filter(func)
— фильтрует элементы на основе результата функции-предиката (true - оставить, false - убрать)
filterNot(func)
2.0.0 — фильтрует элементы на основе обратного результата функции-предиката (false - оставить, true - убрать)
map(func)
— преобразует каждый элемент
flatMap(func)
— преобразует каждый элемент в массив
sorted(func)
— сортирует элементы в соответствии с функцией-компаратором
sortBy(func)
— применяет функцию, затем сортирует элементы
groupBy(func)
2.0.0 — группирует элементы на основе результата выполнения функции
takeWhile(func)
— собирает элементы пока функция-предикат возвращает true
dropWhile(func)
— пропускает элементы пока функция-предикат возвращает true
peek(func)
— вызывает функцию для каждого элемента и возвращает stream
skip(count)
— пропускает указанное количество элементов
limit(count)
— ограничивает количество элементов
custom(func)
— выполняет пользовательскую операцию над данными
use std, functional
println stream([1, 2, 3, 4])
.custom(::reverse)
.toArray()
def reverse(container) {
size = length(container)
result = newarray(size)
for i : range(size) {
result[size - i - 1] = container[i]
}
return result
}
reduce(func)
— преобразует элементы в одно значение
forEach(func)
— вызывает функцию для каждого элемента
forEachIndexed(func)
2.0.0 — вызывает функцию для каждого элемента и его порядкового номера
joining(delimiter = "", prefix = "", suffix = "")
— склеивает элементы в строку
toArray()
— возвращает массив элементов
toMap(keyMapper, valueMapper = def(v) = v, merger = def(oldValue, newValue) = newValue)
2.0.0 — преобразует элементы в объект, основываясь на результате функций keyMapper
и valueMapper
. Функция merger
используется для разрешения коллизий
anyMatch(predicate)
2.0.0 — возвращает true
, если хотя бы один элемент удовлетворяет функции predicate
, иначе возвращает false
allMatch(predicate)
2.0.0 — возвращает true
, если все элементы удовлетворяют функции predicate
, иначе возвращает false
noneMatch(predicate)
2.0.0 — возвращает true
, если нет элементов, удовлетворяющих функции predicate
, иначе возвращает false
count()
— возвращает количество элементов