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() — возвращает количество элементов