7.4 List
类似于其它语言中的数组
7.4.1 列表的创建
void main(List<String> args) {
// 使用字面量创建
final list1 = [1, 2, 3, 4, 5];
print(list1);
// 创建空数组进行添加
var list2 = [];
list2.add(123);
list2.add("456");
print(list2);
// 使用填充来创建
final list3 = List.filled(5, 100);
print(list3);
// 使用其它函数来创建
final list4 = List.generate(3, (index) => index * 2);
print(list4);
final list5 = List.empty(growable: true);
list5.add(0);
print(list5);
// 新的创建方式 -- 了解
bool flag = true;
var list6 = [
'a',
'b',
if (flag) 'C' else 'D',
];
print(list6);
var list7 = [
'#0',
for (var i in [10, 200, 3000]) '#$i'
];
print(list7);
}
7.4.2 下标、长度、判空
void main(List<String> args) {
final list = [1, 2, 3, 4, 5];
// 下标从0开始
print(list[0]);
print(list[1]);
// 不能越界访问
try {
print(list[5]);
} catch (e) {
print(e.toString());
}
// 长度
print(list.length);
// 判空
print(list.isEmpty);
print(list.isNotEmpty);
print([].length);
print([].isEmpty);
}
7.4.3 遍历
普通的 for 循环、for in、 for each
void main(List<String> args) {
final list = [1, 2, 3, 4, 5];
print(" === for === ");
for (int i = 0; i < list.length; i++) {
print("i = $i, element: ${list[i]}");
}
print("=== for in === ");
for (var element in list) {
print("element: $element");
}
print("=== for each === ");
list.forEach((element) {
print("element: $element");
});
}
7.4.4 元素查找
void main(List<String> args) {
final list = [10, 20, 20, 30, 40, 50];
print(list.indexOf(10)); // 0
print(list.indexOf(100)); // -1
print(list.lastIndexOf(20)); // 2
print(list.indexWhere((element) => element >= 20)); // 1
print(list.indexOf(20, 2)); // 2
// 只有一个元素
if (list.length == 1) {
print(list.single);
} else {
print("元素不唯一");
}
// 首尾元素
print(list.first);
print(list.last);
// print(list.firstWhere((element) => element > 100)); // 崩溃,没有
print(list.lastWhere((element) => element < 30)); // 20
}
7.4.5 增加元素
- add/addAll
- insert
void main(List<String> args) {
final list = List.empty(growable: true);
list.add(100);
list.addAll(['a', true, 3.12]);
print(list);
// 指定位置添加 此位置原有的元素向后移动。
list.insert(0, "start");
print(list);
// 追加
list.insert(list.length - 1, ['0', "end"]);
print(list);
// 限制类型添加
final list2 = <String>[];
list2.add("hello");
// list2.add(100); // 错误,只能是String
// list2.addAll(["hello", true]); // 错误,只能是字符串
print(list2);
// 替换元素
final list3 = [10, 20, 20, 30, 40, 50];
list3.replaceRange(0, 3, [11, 22, 33, 44, 55, 66]);
print(list3);
}
7.4.6 删除元素
- clear
- removeXXX
void main(List<String> args) {
final list = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100];
// 删除指定元素
list.remove(50);
print(list); // 没有50
// 通过下标删除
list.removeAt(0);
print(list); // 没有10
// 删除最后一个
list.removeLast(); // 没有100
print(list);
// 按条件删除
list.removeWhere((element) => element >= 80);
print(list); // 所有元素都小于 80
// 按范围删除
list.removeRange(1, 3); // 删除索引是1, 2 的元素
print(list);
// 清除所有
list.clear();
print(list);
}
7.4.7 列表子集
void main(List<String> args) {
final list = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100];
// 截取的子集 [start, end)
print(list.sublist(1, 5)); // 从1~4的下标, 返回List
print(list);
// 获取子集
print(list.getRange(1, 5)); // 返回可迭代对象
print(list);
}
7.4.8 排序
- reversed 不会改变原来的数组
- sort 参数中可以使用 compareTo 等方法,但会改变原来的数组。
void main(List<String> args) {
final list = [10, 20, 20, 30, 40, 50];
print(list.reversed); // 不会改变原来的数组
print(list);
// 排序会导致原数组发生变化, 大于0降序,小于0则为升序。
list.sort((a, b) => b - a);
print(list);
}
7.4.9 集合的判断
- where
- any
- every
void main(List<String> args) {
final list = [10, 20, 20, 30, 40, 50];
// 符合条件的集合
print(list.where((element) => element >= 30));
// 查询满足任何一个条件就返回
print(list.any((element) => element >= 50));
// 每个都要满足
print(list.every((element) => element >= 20));
}
7.4.10 元素与字符串的转换
void main(List<String> args) {
final list = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100];
// 列表转换字符串
var str = list.toString();
print(str.runtimeType);
print(str);
str = list.join("-");
print(str);
// 字符串转播列表
final list2 = str.split("-");
print(list2.runtimeType);
print(list2);
}
7.4.9 常列表
- const 修饰的列表为常列表,不可以更改。
- final 修饰的列表是可以修改的
void main(List<String> args) {
const list1 = const [10, 20, 30]; // 右侧的const可以省略
const list2 = [10, 20, 30];
print(list1 == list2); // true
print(identical(list1, list2)); // true
// 常列表不可以修改
// list1[0] = 100; // 崩溃
final list3 = [10, 20, 30];
final list4 = [10, 20, 30];
print(list3 == list4); // false
print(identical(list3, list4)); // false
final list5 = list3;
print(list5 == list3); // true
list3[0] = 10086; // final修饰的列表可以修改
}
7.4.10 扩展运算符(了解)
使用扩展运算符(...)将列表的所有元素插入另一个列表 如果扩展运算符右侧的表达式可能为 null,则可以通过使用支持 null 的扩展运算符(...?)来避免异常
void main(List<String> args) {
final list1 = List.filled(3, 6);
final list2 = [0, 1, 2, ...list1];
print(list2);
var list3;
final list4 = [8, 9, ...?list3];
print(list4);
}