Dart 的数据类型 —— Listdart 中集合类型的数据有 3 种 —— List、Set 和 Map。本篇主要介
本篇主要介绍 List,也就是 dart 中的数组,期间会结合对比 js 数组的属性和方法,方便记忆理解。
声明方式
可以通过字面量或构造函数两种方式来声明。
字面量方式
像 List l1 = ['a', 1];
声明的 l1
,数组内的元素的数据类型是不限定的;但如果是像 List l2 = <int>[1, 2];
这样声明的 l2
,则数组内的元素必须都是 int
类型。
还可以结合使用扩展操作符 ...
来声明 List,比如 var l3 = [1, ...l2];
。为了避免 l2
为 null
导致的报错,还可以在 ...
后添加上 ?
,即 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
(命名参数写法),则默认 growable
为 false
,给 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']);
insert
或insertAll
:在指定位置插入元素。
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:
如果想转成 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);
转载自:https://juejin.cn/post/7424398516699070518