Dart リスト(配列)をフラット(flat)にする

Dart リスト(配列)をフラット(flat)にする

Dartで、リスト(配列)の各値の演算結果を蓄積するコードを記述してます。「expand」を使用して「toList()」で再度リストに変換します。「collection.dart」の「flattened」を使用する方法も記載してます。

環境

  • OS windows11 home
  • Dart 2.18.1

フラット(flat)

フラット(flat)するには、要素を展開することができる「 expand 」を使用します。

リスト.expand((v) => v)

※戻りは「Iterable」なため「toList()」でリストに戻します。

実際に、使用してフラットしてみます。

void main() {
  var list = [[1, 2, 3], ['aaa', 'bbb', 'ccc'], [true, false]];

  print(list.expand((v) => v));
  // (1, 2, 3, aaa, bbb, ccc, true, false)

  print(list.expand((v) => v).runtimeType);
  // ExpandIterable<List<Object>, Object>

  print(list.expand((v) => v).toList());
  // [1, 2, 3, aaa, bbb, ccc, true, false]
}

実行結果を見ると、フラットになっていることが確認できます。

空の配列に使用した場合は、結果は空となります。

void main() {
  var list = [[], [], []];

  print(list.expand((v) => v));
  // ()

  print(list.expand((v) => v).runtimeType);
  // ExpandIterable<List<dynamic>, dynamic>

  print(list.expand((v) => v).toList());
  // []
}

flattened

「dart.dev」に公開されている「collection.dart」の「flattened」を使用してフラットにすることも可能です。

最新版はこちらで確認できます。「pubspec.yaml」がなければ作成して以下を追加して使用します。

name: sample
dependencies:
  collection: ^1.17.0
environment:
  sdk: '>=2.10.0 <3.0.0'

実行します。

import 'package:collection/collection.dart';

void main() {
  var list = [[1, 2, 3], ['aaa', 'bbb', 'ccc'], [true, false]];

  print(list.flattened);
  // (1, 2, 3, aaa, bbb, ccc, true, false)

  print(list.flattened.runtimeType);
  // _SyncStarIterable<Object>

  print(list.flattened.toList());
  // [1, 2, 3, aaa, bbb, ccc, true, false]
}

フラットになっていることが確認できます。