Преобразование таблиц: map, filter, reduce
Создавайте функциональные вспомогательные функции высшего порядка для преобразования таблиц.
«Преобразование таблиц: map, filter, reduce» — бесплатный урок Lua Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Функциональные шаблоны в Lua
В Lua нет встроенных функций отображения, фильтрации и свёртки, но их легко реализовать с помощью замыканий и обобщённых циклов for.
Отображение: преобразование каждого элемента
map применяет функцию к каждому элементу и возвращает новую таблицу с результатами.
local function map(t, fn)
local result = {}
for i, v in ipairs(t) do result[i] = fn(v) end
return result
end
local doubled = map({1,2,3}, function(x) return x * 2 end)
print(table.concat(doubled, ", ")) -- 2, 4, 6Фильтрация: сохранение подходящих элементов
filter сохраняет только те элементы, для которых предикат возвращает true.
local function filter(t, pred)
local result = {}
for _, v in ipairs(t) do
if pred(v) then result[#result+1] = v end
end
return result
end
local evens = filter({1,2,3,4,5}, function(x) return x % 2 == 0 end)
print(table.concat(evens, ", ")) -- 2, 4Свёртка: получение одного значения
reduce объединяет элементы слева направо с помощью аккумулятора.
local function reduce(t, fn, init)
local acc = init
for _, v in ipairs(t) do acc = fn(acc, v) end
return acc
end
local sum = reduce({1,2,3,4,5}, function(a,b) return a+b end, 0)
print(sum) -- 15Цепочки операций
Объединяйте map, filter и reduce в цепочки для выразительной обработки потоков данных.
local nums = {1,2,3,4,5,6,7,8,9,10}
local result = reduce(
map(
filter(nums, function(x) return x % 2 == 0 end),
function(x) return x * x end
),
function(a,b) return a + b end, 0
)
print(result) -- 220forEach: побочные эффекты
forEach перебирает элементы, не создавая новую таблицу, что удобно для побочных эффектов, например вывода.
local function forEach(t, fn)
for i, v in ipairs(t) do fn(v, i) end
end
forEach({"a","b","c"}, function(v, i) print(i, v) end)flatMap: отображение с последующим уплощением
flatMap преобразует каждый элемент в список, а затем объединяет все списки.
local function flatMap(t, fn)
local result = {}
for _, v in ipairs(t) do
for _, item in ipairs(fn(v)) do
result[#result+1] = item
end
end
return result
end
local expanded = flatMap({1,2,3}, function(x) return {x, x*10} end)zip: объединение двух таблиц
zip объединяет элементы двух таблиц в таблицу пар.
local function zip(a, b)
local result = {}
for i = 1, math.min(#a, #b) do
result[i] = {a[i], b[i]}
end
return result
end
local zipped = zip({1,2,3}, {"a","b","c"})Работа с таблицами-словарями
Для таблиц «ключ—значение» используйте pairs, а не ipairs, и собирайте пары ключ—значение.
local function mapValues(t, fn)
local result = {}
for k, v in pairs(t) do result[k] = fn(v) end
return result
end
local doubled = mapValues({x=1,y=2}, function(v) return v*2 end)Концепция ленивого вычисления
Для больших наборов данных рассмотрите ленивые итераторы — замыкания, выдающие по одному элементу за раз. Это позволяет не создавать большие промежуточные таблицы.
Замечание о производительности
Каждый вызов map или filter выделяет новую таблицу. В тесных циклах изменение на месте может быть эффективнее, но это снижает неизменяемость и ясность кода.
Вопрос о reduce
Что возвращает reduce({1,2,3,4}, function(a,b) return a+b end, 0)?
Повторение: map, filter и reduce
map преобразует, filter отбирает, reduce сворачивает. Эти три функции высшего порядка образуют основу функциональной обработки данных в Lua.
Часто задаваемые вопросы
Урок «Преобразование таблиц: map, filter, reduce» бесплатный?
Да — полный текст урока «Преобразование таблиц: map, filter, reduce» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Преобразование таблиц: map, filter, reduce»?
Создавайте функциональные вспомогательные функции высшего порядка для преобразования таблиц. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Преобразование таблиц: map, filter, reduce»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- table.sort с компараторами
- table.concat и table.move
- Глубокое и поверхностное копирование
- Преобразование таблиц: map, filter, reduce