Dart: Collections

14th December 2020 at 9:07am

Dart 的集合类型,最重要的是这三个:ListSetMap

字面值

他们有各自的字面值:

// List
var l1 = [1, 2, 3];          // 不带类型,编译器推断
var l2 = <int>[1, 2, 3];     // 带类型

// Set
var s1 = {1, 2, 3};          // 不带类型,编译器推断
var s2 = <int>{1, 2, 3};     // 带类型

// Map
var m1 = {1: 'a', 2: 'b'};   // 不带类型,编译器推断
var m2 = <int, String>{1: 'a', 2: 'b'};   // 带类型

由于 SetMap 的字面值很相近,表达一个空 Set 和空 Map,需要额外的注意:

// 空 Map,m1 及 m2 等价;m3 带类型
var m1 = {};
var m2 = <dynamic, dynamic>{};
var m3 = <int, String>{};

// 空 Set
var s1 = <dynamic>{};
var s2 = <int>{};

Spread operator

Dart 也有类似 JS 的 spread operator,而且它还有 null-aware spread operator:

var list = [1, 2, 3];
var list2 = [0, ...list];
assert(list2.length == 4);

var list;
var list2 = [0, ...?list];
assert(list2.length == 1);

Collection if / for

这两个特性是语法糖,简单用可以,不要滥用。

collection if:

var nav = [
  'Home',
  'Furniture',
  'Plants',
  if (promoActive) 'Outlet'
];

collection for:

var listOfInts = [1, 2, 3];
var listOfStrings = [
  '#0',
  for (var i in listOfInts) '#$i'
];
assert(listOfStrings[1] == '#1');