Dart基础 04 - List类型

110 阅读3分钟

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);
}