0Pricing
Lua Academy · レッスン

テーブルの変換:map、filter、reduce

テーブル変換のための関数型高階ヘルパーを作成します。

「テーブルの変換:map、filter、reduce」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

Luaの関数型パターン

Luaには組み込みのmap/filter/reduceはありませんが、クロージャとgeneric forループを使えば簡単に実装できます。

map:すべての要素を変換

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:条件に一致する要素を残す

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:単一の値へ畳み込む

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)  -- 220

forEach:副作用

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:mapして平坦化

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:2つのテーブルを結合

zipは2つのテーブルの要素を組み合わせ、ペアのテーブルを作成します。

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"})

辞書型テーブルの操作

キーと値を持つテーブルでは、ipairsではなくpairsで反復処理し、キーと値のペアを収集します。

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)

遅延評価の概念

大規模なデータセットでは、大きな中間テーブルの作成を避けるため、遅延イテレーター(1回に1つの要素を生成するクロージャ)を検討してください。

パフォーマンスに関する注意

mapとfilterを実行するたびに、新しいテーブルが割り当てられます。タイトなループでは、その場で変更する方が効率的な場合がありますが、不変性と可読性は損なわれます。

reduceに関する質問

reduce({1,2,3,4}, function(a,b) return a+b end, 0)は何を返しますか?

まとめ:map/filter/reduce

mapは変換し、filterは選択し、reduceは畳み込みます。この3つの高階関数は、Luaで関数型データ処理を行う基盤です。

よくある質問

「テーブルの変換:map、filter、reduce」レッスンは無料ですか?

はい。「テーブルの変換:map、filter、reduce」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「テーブルの変換:map、filter、reduce」で何を学びますか?

テーブル変換のための関数型高階ヘルパーを作成します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「テーブルの変換:map、filter、reduce」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. コンパレーターによるtable.sort
  2. table.concatとtable.move
  3. ディープコピーとシャローコピー
  4. テーブルの変換:map、filter、reduce
← Lua Academyに戻る