0Pricing
Dart Academy · レッスン

fold、reduce、expand

Iterable を集約して平坦化します

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

コレクションを集約する

合計や最大値のように、リスト全体を1つの値にまとめたいことはよくあります。Dartには、そのためのfoldとreduceがあります。🧮

reduceを使う

reduceは、関数を使って要素をペアごとに結合します。最初の要素から始めるため、リストは空であってはいけません。

var sum = [1, 2, 3, 4].reduce((a, b) => a + b);
print(sum); // 10

reduceは結果を保持する

各ステップでは、計算途中の結果と次の要素を受け取ります。aは、処理が進むにつれて成長するアキュムレーターだと考えてください。

var max = [3, 9, 2].reduce((a, b) => a > b ? a : b);
print(max); // 9

空のリストの落とし穴

空のリストにreduceを呼び出すとStateErrorがスローされます。リストが空になる可能性がある場合は、代わりにfoldを使いましょう。

foldを使う

foldはreduceに似ていますが、開始値を指定します。この初期値によって結果の型が決まり、空のリストも安全に処理できます。

var total = [1, 2, 3].fold(0, (a, b) => a + b);
print(total); // 6

foldは型を変更できる

初期値によって型が決まるため、foldではintのリストをStringやMapなど、必要な型に変換できます。

var joined = [1, 2, 3].fold('', (a, b) => '$a$b');
print(joined); // 123

空の場合もfoldは安全

リストが空の場合、foldは初期値をそのまま返します。クラッシュせず、特別な場合分けを覚える必要もありません。

var s = <int>[].fold(0, (a, b) => a + b);
print(s); // 0

reduceとfoldの違い

空でないリストを同じ型の値として手早く結合するならreduceを使います。初期値が必要な場合や、結果の型を変えたい場合はfoldを使いましょう。

expandを使う

expandは各要素をIterableに変換し、それらをすべて平坦化して1つの値のストリームにします。mapとflattenを組み合わせたものです。

var r = [1, 2].expand((n) => [n, n * 10]);
print(r.toList()); // [1, 10, 2, 20]

ネストしたリストを平坦化する

expandは、リストのリストを1回のすっきりした呼び出しで、1つの平坦なリストに変換する用途によく使われます。

var flat = [[1, 2], [3, 4]].expand((x) => x);
print(flat.toList()); // [1, 2, 3, 4]

3つを連結する

これらのメソッドはきれいに組み合わせられます。expandで平坦化し、続けてfoldで集約するという、読みやすい1つのパイプラインを作れます。

var t = [[1, 2], [3]].expand((x) => x).fold(0, (a, b) => a + b);
print(t); // 6

クイックチェック

空のリストでも安全に合計できる、適切なツールを選んでください。

まとめ

reduceは結合し、foldは初期値付きで結合し、expandは平坦化します。これらを組み合わせれば、どんなコレクションでも簡単に集約できます。🎉

よくある質問

「fold、reduce、expand」レッスンは無料ですか?

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

「fold、reduce、expand」で何を学びますか?

Iterable を集約して平坦化します ブラウザで直接実行するハンズオンコードでDart Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「fold、reduce、expand」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. 高階関数とカリー化
  2. fold、reduce、expand
  3. sync* による遅延 Iterable とジェネレーター
  4. 純粋関数パイプラインの合成
← Dart Academyに戻る