likes
comments
collection
share

Dart 的数据类型 —— Listdart 中集合类型的数据有 3 种 —— List、Set 和 Map。本篇主要介

作者站长头像
站长
· 阅读数 33

本篇主要介绍 List,也就是 dart 中的数组,期间会结合对比 js 数组的属性和方法,方便记忆理解。

声明方式

可以通过字面量或构造函数两种方式来声明。

字面量方式

List l1 = ['a', 1]; 声明的 l1,数组内的元素的数据类型是不限定的;但如果是像 List l2 = <int>[1, 2]; 这样声明的 l2,则数组内的元素必须都是 int 类型。 还可以结合使用扩展操作符 ... 来声明 List,比如 var l3 = [1, ...l2];。为了避免 l2null 导致的报错,还可以在 ... 后添加上 ?,即 var l3 = [1, ...?l2];

构造函数方式

  • 使用 List.empty() 方法,其实是 new List.empty(),但可以省略 new
void main() {
  var names = List.empty(growable: true);
  names.add('Jay');
  print(names); // [Jay]
}

如果不传 growable: true(命名参数写法),则默认 growablefalse,给 names 添加元素在执行时就会报错。

  • 使用 List.filled() 方法,填充指定个数的元素:
void main() {
  var names = List.filled(3, 'Jay', growable: true);
  print(names); // [Jay, Jay, Jay]
}

常见 Api

List 的有些属性或方法和 js 的数组类似,比如也有 length 属性,join 方法也是将数组的所有元素拼接成字符串(但是如果不指定分割符不会像 js 那样有默认的逗号),同样有 for 循环等。下面列举些常用的方法:

  • addAll:除了上文例子中用过的 add 方法,如果想一次添加多个元素,可以使用 addAll,传入的是 iterable,比如 List 或是之后会介绍的 Set 和 Map。
var names = ['Jay', 'Eson', 'Mayday'];
names.addAll(['Join', 'Sindy']);
  • insertinsertAll:在指定位置插入元素。
names.insert(1, 'Jams');
names.insertAll(1, ['Joly', 'Chaim']);

  • remove:删除某个元素,比如 names.remove('Sindy');
  • removeAt:删除某个位置的元素,比如 names.removeAt(0);
  • clear:清空数组。
names.clear();
print(names.isEmpty); // true

可以通过 .isEmpty 来查看数组是否为空。

遍历

  • for 循环和 js 中的用法一致,for...in 则类似于 js 的 for...of
void main() {
  var names = ['Jay', 'Eson', 'Mayday'];
  for (var i = 0; i < names.length; i++) {
    print(names[i]); // 依次打印 Jay Eson Mayday
  }

  for (var item in names) {
    print(item); // 依次打印 Jay Eson Mayday
  }
}
  • forEach 的用法如下,传入的函数为 dart 中匿名函数的写法,另外语句后还要跟上分号:
void main() {
  var names = ['Jay', 'Eson', 'Mayday'];
  names.forEach((element) {
    print(element);
  });
}
  • map 遍历后会返回新的 Iterable 数据:
void main() {
  var nums = [1, 2, 3];
  var newNums = nums.map((e) {
    return e * 2;
  });

  print(newNums);
}

打印结果如下,可以看到是使用 () 包裹的,并不是 List:

Dart 的数据类型 —— Listdart 中集合类型的数据有 3 种 —— List、Set 和 Map。本篇主要介

如果想转成 List,还需要调用 toList() 方法: newNums.toList()

  • where,类似 js 中的 filter 方法,用于筛选满足条件的元素,返回的结果同样需要调用 toList() 才会转成 List:
void main() {
  var nums = [1, 2, 3];
  var newNums = nums.where((item) => item < 2);
  print(newNums.toList()); // [1]
}
  • any:同 js 数组的 some 方法类似,返回一个布尔值。
print(nums.any((item) => item == 2)); // true
  • every:js 的数组方法里也有 every,用法几乎相同。
print(nums.every((item) => item == 2)); // false
  • expand,可用于将二维数组展开为一维数组:
void main() {
  var nums = [
    [1],
    [2, 3]
  ];

  print(nums.expand((element) => element).toList()); // [1, 2, 3]
}

其类似于 js 数组的 flat 方法,但 expand 调用时,其回调中的 element 必须为 Iterable<_> 对象,也就是说 nums 里的每个元素都得是数组,不能是类似 [1, [2, 3]] 这样的,而 js 的 flat 可以。

  • fold,类似于 js 的 reduce 方法,用于对数组中的每一个元素做个累计地操作,比如可以用来做累加的计算,只不过 fold 第一个参数是初始值,第二个参数是回调,而 reduce 则反过来。
void main() {
  var nums = [1, 2, 3];
  var result = nums.fold(0, (prev, element) => prev + element);
  print(result); // 6
}

判断 2 个数组是否相等

先去 pubspec.yaml 安装 collection:

dependencies:
  collection: ^1.18.0

然后就可以使用其中的 ListEquality().equals() 来判断了,返回值为 bool 类型:

import 'package:collection/collection.dart';

ListEquality().equals(list1, list2);

Dart 的数据类型 —— Listdart 中集合类型的数据有 3 种 —— List、Set 和 Map。本篇主要介 Dart 的数据类型 —— Listdart 中集合类型的数据有 3 种 —— List、Set 和 Map。本篇主要介

转载自:https://juejin.cn/post/7424398516699070518
评论
请登录