List

创建列表

非固定长度, 可以通过 add 方法添加元素

var testList = List();
// List testList = List();
print(testList.length); // 0
testList.add(1);
print(testList.length); // 1

固定长度, 不能动态增加长度

var fixedList = List(2);
print(testList.length); // 2
testList[0] = 1;
//  testList[2] = 1; // Error
//  testList.add(1); // Error

通过 List.fromList.of 转换

var s = {1, 2, 3};
var l = List.from(s); // [1, 2, 3]
var s = {1, 2, 3};
var l = List.of(s); // [1, 2, 3]

通过 List.filled 填充

var l = List.filled(3, 2); // [2, 2, 2]

使用泛型, 固定元素类型

var typeList = List<String>(); // 只能添加字符串类型的元素
typeList.add("hello"); // 正确
typeList.add(1); // 错误。类型不正确

直接赋值

var numList = [1, 2, 3]; // 编译器猜测类型为 List<int>
numList.add("hello"); // 错误,类型不正确
var dyList = [true, 1]; // 编译器猜测类型为 List<dynamic>
dyList.add("hello"); // ok

常用属性及方法

List 继承了 Iterable 的属性及方法, 重写了部分属性及方法

  • length ↔ int 长度
  • first ↔ E 返回第一个元素
  • last ↔ E 返回最后一个元素
  • reversed → Iterable<E> 反转列表, 只读

举例:

var list = [1, '', false];
print(list.length); // 3
print(list.indexOf('')); // 1
list.add(null); // [1, '', false, null]
list.remove(false); // [1, '', null]
print(list.reversed); // (null, , 1) 只读
print(list.first); // 1
print(list.last); // null
list.addAll(['ok', true]); // [1, '', null, 'ok', true]
list.clear(); // [1, '', null, 'ok', true]

添加

在列表末尾添加一个或多个元素

  • add(E value) → void
  • addAll(Iterable<E> iterable) → void

示例:

var list = [1,2,3];
list.add(1, 5); // [1, 2, 3, 5]
list.addAll(1, [10,20]); // [1, 2, 3, 5, 10, 20]

插入

在列表指定位置插入一个或多个元素

  • insert(int index, E element) → void
  • insertAll(int index, Iterable<E> iterable) → void

示例:

var list = [1,2,3];
list.insert(1, 5); // [1, 5, 2, 3]
list.insertAll(1, [10,20]); // [1, 10, 20, 5, 2, 3]

移除

  • remove(Object value) → bool 移除指定元素
  • removeAt(int index) → E 移除指定下标的元素
  • removeLast() → E 出栈(移除最后一个元素)
  • removeRange(int start, int end) → void 移除范围内元素

示例:

var list = [1,2,3,4,5];
list.remove(1); // [2, 3, 4, 5]
list.removeAt(1); // [2, 4, 5]
list.removeLast(); // [2, 4]
list = [1,2,3,4,5];
list.removeRange(0, 2); // [3, 4, 5]

排序

  • sort([int compare(E a, E b) ]) → void

其他

  • contains(Object element) → bool 检测列表是否包含某个元素
  • elementAt(int index) → E 返回某个下标的元素
  • indexOf(E element, [ int start = 0 ]) → int 查询元素索引(索引从 0 开始)
  • lastIndexOf(E element, [ int start ]) → int 从末尾开始查询元素索引
  • clear() → void 清空列表

类型转换

转换为 Map<int, E>

var list = [1, '', false, 'ok', true];
list.asMap(); // {0: 1, 1: , 2: false, 3: ok, 4: true}

转换为 Set<E>

var list = [1, 2, 3, 3, 4, 5];
print(list.toSet()); // {1, 2, 3, 4, 5}

转换为 String

list.toString();

高阶函数

every

跟 JS 一样, 不多解释了

  • every(bool test(E element)) → bool
  • any(bool test(E element)) → bool
var list = [1,2,3,4,5];
bool f1 = list.every((e) => e > 0); // true
bool f2 = list.any((e) => e < 0); // false

reduce

跟 JS 一样, 不多解释了

  • reduce(E combine(E value, E element)) → E
var list = [1,2,3,4,5];
var r = list.reduce((e1, e2) => e1 + e2); // 15

map

map 可以对列表进行操作并通过 toList 返回新的列表

  • map<T>(T f(E e)) → Iterable<T>
var list = [1,2,3,4,5];
var l2 = list.map((e) => e + 1).toList(); // [2, 3, 4, 5, 6]

where

类似于 JS 的 filter, 用于筛选指定条件的元素

var testList = [1, 2, 3, 4];
var whereList = testList.where((num) => num > 2).toList(); // [3, 4]

运算符重载

+ 被重置为拼接两个列表

var list1 = [1,2,3];
var list2 = [3,4,5];
print(list1 + list2); // [1, 2, 3, 3, 4, 5]

== 用于比较连个列表是否指向同一片内存区域:

var list1 = [3,4,5];
var list2 = [3,4,5];
var list3 = list1;
print(list1 == list2); // false
print(list1 == list3); // true
  • operator [](int index) → E 取值
  • operator []=(int index, E value) → void 赋值

参考资料

MIT Licensed | Copyright © 2018-present 滇ICP备16006294号

Design by Quanzaiyu | Power by VuePress