2020-03-20 18:20:59 +00:00
# Функции высшего порядка {#higher-order-functions}
2017-10-25 05:27:09 +00:00
2020-03-20 18:20:59 +00:00
## Оператор `->`, функция lambda(params, expr) {#operator-funktsiia-lambdaparams-expr}
2017-03-12 17:58:51 +00:00
Позволяет описать лямбда-функцию для передачи в функцию высшего порядка. Слева от стрелочки стоит формальный параметр - произвольный идентификатор, или несколько формальных параметров - произвольные идентификаторы в кортеже. Справа от стрелочки стоит выражение, в котором могут использоваться эти формальные параметры, а также любые столбцы таблицы.
2017-10-25 05:27:09 +00:00
Примеры: `x -> 2 * x, str -> str != Referer.`
2017-03-12 17:58:51 +00:00
Функции высшего порядка, в качестве своего функционального аргумента могут принимать только лямбда-функции.
В функции высшего порядка может быть передана лямбда-функция, принимающая несколько аргументов. В этом случае, в функцию высшего порядка передаётся несколько массивов одинаковых длин, которым эти аргументы будут соответствовать.
2019-06-14 12:44:33 +00:00
Для некоторых функций, например [arrayCount ](#higher_order_functions-array-count ) или [arraySum ](#higher_order_functions-array-sum ), первый аргумент (лямбда-функция) может отсутствовать. В этом случае, подразумевается тождественное отображение.
2017-03-12 17:58:51 +00:00
2019-04-24 14:35:52 +00:00
Для функций, перечисленных ниже, лямбда-функцию должна быть указана всегда:
2017-03-12 17:58:51 +00:00
2020-03-21 04:11:51 +00:00
- [arrayMap ](#higher_order_functions-array-map )
- [arrayFilter ](#higher_order_functions-array-filter )
- [arrayFirst ](#higher_order_functions-array-first )
- [arrayFirstIndex ](#higher_order_functions-array-first-index )
2019-04-24 14:35:52 +00:00
2020-03-22 09:14:59 +00:00
### arrayMap(func, arr1, …) {#higher_order_functions-array-map}
2019-04-24 14:35:52 +00:00
Вернуть массив, полученный на основе результатов применения функции `func` к каждому элементу массива `arr` .
Примеры:
2020-03-20 18:20:59 +00:00
``` sql
2019-04-24 14:35:52 +00:00
SELECT arrayMap(x -> (x + 2), [1, 2, 3]) as res;
2019-09-23 15:31:46 +00:00
```
2020-03-20 18:20:59 +00:00
``` text
2019-04-24 14:35:52 +00:00
┌─res─────┐
│ [3,4,5] │
└─────────┘
```
Следующий пример показывает, как создать кортежи из элементов разных массивов:
2020-03-20 18:20:59 +00:00
``` sql
2019-04-24 14:35:52 +00:00
SELECT arrayMap((x, y) -> (x, y), [1, 2, 3], [4, 5, 6]) AS res
2019-09-23 15:31:46 +00:00
```
2020-03-20 18:20:59 +00:00
``` text
2019-04-24 14:35:52 +00:00
┌─res─────────────────┐
│ [(1,4),(2,5),(3,6)] │
└─────────────────────┘
```
2019-06-06 14:13:23 +00:00
Обратите внимание, что у функции `arrayMap` первый аргумент (лямбда-функция) не может быть опущен.
2020-03-22 09:14:59 +00:00
### arrayFilter(func, arr1, …) {#higher_order_functions-array-filter}
2019-04-24 14:35:52 +00:00
2020-03-20 18:20:59 +00:00
Вернуть массив, содержащий только те элементы массива `arr1` , для которых функция `func` возвращает не 0.
2017-03-12 17:58:51 +00:00
Примеры:
2020-03-20 18:20:59 +00:00
``` sql
2017-10-25 05:27:09 +00:00
SELECT arrayFilter(x -> x LIKE '%World%', ['Hello', 'abc World']) AS res
```
2020-03-20 18:20:59 +00:00
``` text
2017-10-25 05:27:09 +00:00
┌─res───────────┐
│ ['abc World'] │
└───────────────┘
```
2020-03-20 18:20:59 +00:00
``` sql
2017-10-25 05:27:09 +00:00
SELECT
arrayFilter(
(i, x) -> x LIKE '%World%',
arrayEnumerate(arr),
['Hello', 'abc World'] AS arr)
AS res
```
2020-03-20 18:20:59 +00:00
``` text
2017-10-25 05:27:09 +00:00
┌─res─┐
│ [2] │
└─────┘
```
2019-06-06 14:13:23 +00:00
Обратите внимание, что у функции `arrayFilter` первый аргумент (лямбда-функция) не может быть опущен.
2020-03-22 09:14:59 +00:00
### arrayCount(\[func,\] arr1, …) {#higher_order_functions-array-count}
2020-03-20 18:20:59 +00:00
2019-04-24 14:35:52 +00:00
Вернуть количество элементов массива `arr` , для которых функция func возвращает не 0. Если func не указана - вернуть количество ненулевых элементов массива.
2017-03-12 17:58:51 +00:00
2020-03-20 18:20:59 +00:00
### arrayExists(\[func,\] arr1, …) {#arrayexistsfunc-arr1}
2019-04-24 14:35:52 +00:00
Вернуть 1, если существует хотя бы один элемент массива `arr` , для которого функция func возвращает не 0. Иначе вернуть 0.
2017-03-12 17:58:51 +00:00
2020-03-20 18:20:59 +00:00
### arrayAll(\[func,\] arr1, …) {#arrayallfunc-arr1}
2019-04-24 14:35:52 +00:00
Вернуть 1, если для всех элементов массива `arr` , функция `func` возвращает не 0. Иначе вернуть 0.
2017-03-12 17:58:51 +00:00
2020-03-20 18:20:59 +00:00
### arraySum(\[func,\] arr1, …) {#higher-order-functions-array-sum}
2019-04-24 14:35:52 +00:00
Вернуть сумму значений функции `func` . Если функция не указана - просто вернуть сумму элементов массива.
2017-03-12 17:58:51 +00:00
2020-03-22 09:14:59 +00:00
### arrayFirst(func, arr1, …) {#higher_order_functions-array-first}
2020-03-20 18:20:59 +00:00
2019-04-24 14:35:52 +00:00
Вернуть первый элемент массива `arr1` , для которого функция func возвращает не 0.
2017-03-12 17:58:51 +00:00
2019-06-06 14:13:23 +00:00
Обратите внимание, что у функции `arrayFirst` первый аргумент (лямбда-функция) не может быть опущен.
2020-03-22 09:14:59 +00:00
### arrayFirstIndex(func, arr1, …) {#higher_order_functions-array-first-index}
2019-03-26 15:46:50 +00:00
2019-04-24 14:35:52 +00:00
Вернуть индекс первого элемента массива `arr1` , для которого функция func возвращает не 0.
2018-02-21 10:03:55 +00:00
2019-06-06 14:13:23 +00:00
Обратите внимание, что у функции `arrayFirstFilter` первый аргумент (лямбда-функция) не может быть опущен.
2020-03-20 18:20:59 +00:00
### arrayCumSum(\[func,\] arr1, …) {#arraycumsumfunc-arr1}
2018-02-21 10:03:55 +00:00
2018-02-21 23:19:56 +00:00
Возвращает массив из частичных сумм элементов исходного массива (сумма с накоплением). Если указана функция `func` , то значения элементов массива преобразуются этой функцией перед суммированием.
2018-02-21 10:03:55 +00:00
Пример:
2020-03-20 18:20:59 +00:00
``` sql
2018-02-21 10:03:55 +00:00
SELECT arrayCumSum([1, 1, 1, 1]) AS res
```
2020-03-20 18:20:59 +00:00
``` text
2018-02-21 10:03:55 +00:00
┌─res──────────┐
│ [1, 2, 3, 4] │
└──────────────┘
```
2018-04-23 07:58:38 +00:00
2020-03-20 18:20:59 +00:00
### arraySort(\[func,\] arr1, …) {#arraysortfunc-arr1}
2018-04-23 07:58:38 +00:00
2020-03-20 18:20:59 +00:00
Возвращает отсортированный в восходящем порядке массив `arr1` . Если задана функция `func` , то порядок сортировки определяется результатом применения функции `func` на элементы массива (массивов).
2018-04-23 07:58:38 +00:00
Для улучшения эффективности сортировки применяется [Преобразование Шварца ](https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A8%D0%B2%D0%B0%D1%80%D1%86%D0%B0 ).
Пример:
2020-03-20 18:20:59 +00:00
``` sql
2018-04-23 07:58:38 +00:00
SELECT arraySort((x, y) -> y, ['hello', 'world'], [2, 1]);
```
2020-03-20 18:20:59 +00:00
``` text
2018-04-23 07:58:38 +00:00
┌─res────────────────┐
│ ['world', 'hello'] │
└────────────────────┘
```
2019-04-24 14:35:52 +00:00
Подробная информация о методе `arraySort` приведена в разделе [Функции по работе с массивами ](array_functions.md#array_functions-sort ).
2019-03-26 15:46:50 +00:00
2020-03-20 18:20:59 +00:00
### arrayReverseSort(\[func,\] arr1, …) {#arrayreversesortfunc-arr1}
2018-04-23 07:58:38 +00:00
2020-03-20 18:20:59 +00:00
Возвращает отсортированный в нисходящем порядке массив `arr1` . Если задана функция `func` , то порядок сортировки определяется результатом применения функции `func` на элементы массива (массивов).
2018-10-16 10:47:17 +00:00
2019-04-24 14:35:52 +00:00
Пример:
2020-03-20 18:20:59 +00:00
``` sql
2019-04-24 14:35:52 +00:00
SELECT arrayReverseSort((x, y) -> y, ['hello', 'world'], [2, 1]) as res;
2019-03-26 15:46:50 +00:00
```
2020-03-20 18:20:59 +00:00
``` text
2019-04-24 14:35:52 +00:00
┌─res───────────────┐
│ ['hello','world'] │
└───────────────────┘
2019-03-26 15:46:50 +00:00
```
2019-04-24 14:35:52 +00:00
Подробная информация о методе `arrayReverseSort` приведена в разделе [Функции по работе с массивами ](array_functions.md#array_functions-reverse-sort ).
2019-03-26 15:46:50 +00:00
2020-01-30 10:34:55 +00:00
[Оригинальная статья ](https://clickhouse.tech/docs/ru/query_language/functions/higher_order_functions/ ) <!--hide-->