Flutter - Dart - List的基本使用

List 定义
1.使用类型推导定义

  var list1 = ['a','b','c','d']; //初始就赋值,限定了长度,限定了类型,只能是String
  print('$list1, ${list1.runtimeType}'); //[a, b, c, d], List<String>
  
  var list3 = ['x','y','z'];
  var list4 = List(); //不限定长度,不限定类型,可添加任意类型的数据
  List list5 = List(); //不限定长度,不限定类型,可添加任意类型的数据
  List list6 = List(2); //限定长度为2  越界会报错,不限定类型,可添加任意类型的数据
  List list7 = ['a',2,'b',false]; //初始化就赋值了,限定了长度,限定了类型,任意位置可用任意类型替换

2.明确指定类型

  List<int> list2 = [1,2,3,4]; //初始就赋值,限定了长度,限定了类型,只能是int
  print("$list2,${list2.runtimeType}"); //[1, 2, 3, 4],List<int>

List 常见属性

   print(list1.length); //4  获取list1长度
   print(list1.isEmpty); //false   字符串是否为空
   print(list1.isNotEmpty);//true  字符串是否不为空
   print(list1.reversed); //(d, c, b, a)   返回一个倒序排列的List,不影响原List;
   print(list1.first);  //a  第一个元素
   print(list1.last);  //d 最后一个元素

List 常用的一些方法

  • add()添加元素
  • addAll()添加List
 list1.add('f');
 list2.add(5);
 print('List增加 $list1,$list2'); //List增加 [a, b, c, d, f],[1, 2, 3, 4, 5]
  //在这里会报错 list2 是一个int类型的,他无法加入到一个string的list里面
 //list1.addAll(list2); //Error: The argument type 'List<int>' can't be assigned to the parameter type 'Iterable<String>'.
  list4.add(1);
  list4.add('aaa');
  list4.add(true);
  print(list4); //[1, aaa, true]

 list1.addAll(list3);//点击addAll这个方法进入官方文档可以看到注解:1.将[iterable]的所有对象追加到该列表的末尾;2.根据[iterable]中的对象数量来扩展列表的长度 ; 3. 如果该列表是固定长度的,则抛出[UnsupportedError]
 print('拼接后的List$list1');// +++++++[a, b, c, d, f, x, y, z]
  • 指定索引位置 插入值,其余顺延
 list1.insert(4, 'g');
print(list1); //[a, b, c, d, g, f, x, y, z]
  • insertAll() 指定位置插入list,其余顺延
 list1.insertAll(5, list3);
 print(list1); //[a, b, c, d, g, x, y, z, f, x, y, z]
  • followedBy()将自身 和参数内的list 元素合并 返回的类型一定是 Iterable
  List<String> list8 = ['aa','bb','cc','x','y','z'];
  Iterable<String> list9 = list8.followedBy(['aa','zz']);
  print('合并后的List $list9'); //合并后的List (aa, bb, cc, x, y, z, aa, zz)
  • removeAt() 删除指定下标的元素
 //在这里可以看出 下标是从0 开始的
list1.removeAt(1); // list1 删除下标为1 的元素
print('List删除下标为1 的元素 $list1');//List删除下标为1 的元素 [b, d, g, x, y, z, f, x, y, z]
  • removeLast() 删除最后一个元素
 list1.removeLast(); // list 删除最后一个元素
print('List删除最后一个元素 $list1');//List删除最后一个元素 [b, d, g, x, y, z, f, x, y]
  • removeRange() //删除范围内的元素
 list1.removeRange(0, 3); //
 print('List 删除 从 0 - 3 的元素 后得到的 $list1');//List 删除 从 0 - 3 的元素 后得到的 [x, y, z, f, x, y]

  • contains() 是否包含某个元素
 list1.contains(1); //是否包含某个元素,
  print('${list1.contains(1)}');//这里返回false,因为现有的list1 里面只有 x,y  所以返回flase
  • removeWhere() 根据条件删除
  list1.removeWhere((element) {return element == 'x';});
  list1.removeWhere((element) => element == 'x'); //这里是函数简写

  • List 中元素重新赋值
 list1[0] = '第一个元素替换';
print(list1); //[第一个元素替换, z, f, y]
  • setRange() 范围内修改List
 //在range 范围内修改List 超出范围报错
  list1.setRange(0, 4, ['a','b','c','d']);
  print(list1);//[a, b, c, d]
  • replaceRange() 范围内替换List
  //在range 范围内替换List 超出范围报错 包含头不包含尾
  List<int> list10 = List();
  list10.add(0);
  list10.add(1);
  list10.add(2);
  list10.add(3);
  list10.add(4);
  list10.replaceRange(1, 4, [7,8,9,10,11]);
  print(list10); //[0, 7, 8, 9, 10, 11, 4]
  • fillRange(start,end,value) 在start end 每个元素用value替换
 List<int> list11 = List();
 list11.add(0);
 list11.add(1);
 list11.add(2); list11.add(3);
 list11.add(4);
 list11.add(5);
 list11.fillRange(1, 5,9);
 print(list11);//[0, 9, 9, 9, 9, 5]
  • retainWhere(()=>(bool)) 根据条件筛选元素
 List<int> list12 = List();
 list12.add(0);
 list12.add(1);
 list12.add(2);
 list12.add(3);
 list12.add(4);
 list12.retainWhere((element) => (element > 2)); //根据条件保留元素
 print(list12);//[3, 4]
  • setAll(index,list) 从index开始,使用list内的元素逐个替换本list中的元素
  List<int> list13 = List();
  list13.add(0);
  list13.add(1);
  list13.add(2);
  list13.add(3);
  list13.add(4);
  list13.setAll(1, [5,6,7,8]); //从index开始替换,但是替换的List长度不能超过现有List的长度
  print(list13); //[0, 5, 6, 7, 8]
  
  • indexOf(element,[start]) 查找指定元素在list中的索引
  List<int> list14 = List();
  list14.add(0);
  list14.add(1);
  list14.add(2);
  list14.add(3);
  list14.add(4);
  list14.add(4);
  int index14 = list14.indexOf(4); //默认从索引0开始查找指定元素,返回指定元素的索引 如果存在多个相同的元素,则返回第一个
  int index141 = list14.indexOf(2,3); //从3 开始查找 2,如果存在返回指定元素索引,反则返回 -1
  print(index14); //4
  print(index141); //-1
  • lastIndexOf(element,[start]) 从后往前查找指定元素在list中的索引
 List<int> list15 = List();
 list15.add(0);
 list15.add(1);
 list15.add(2);
 list15.add(3);
 list15.add(4);
 
 int index15 = list15.lastIndexOf(2); 
 int index151 = list15.lastIndexOf(1,4); //从指定索引位置往后查找指定元素的索引位置,查到返回该元素的索引值,没找到返回-1

 print(index15); //2
 print(index151); //1
 
解析:
在 Dart 中,lastIndexOf 方法用于返回列表中最后一个满足特定条件的元素的索引。如果没有找到元素,则返回 -1。

对于 list15 列表,其元素为 [0, 1, 2, 3, 4]。

int index15 = list15.lastIndexOf(2); 这行代码会找到 2 在列表中最后一次出现的索引位置。在列表 [0, 1, 2, 3, 4] 中,2 最后一次出现的位置是索引 2(索引从 0 开始计数),所以 index15 的值是 2。

int index151 = list15.lastIndexOf(1, 4); 这行代码使用了 lastIndexOf 方法的重载版本,它接受两个参数:要搜索的元素和搜索的起始索引。在这个例子中,它从索引 4 开始向前搜索 1。由于索引 4 已经超出了列表的范围(列表长度为 5,索引从 0 到 4),搜索实际上从列表的末尾开始,即索引 4 处,但不会包括索引 4 本身。因此,它找到的 1 的最后一个出现位置是索引 1,所以 index151 的值是 1。

  • elementAt(index) 根据索引值获取元素
 List<int> list16 = List();
 list16.add(0);
 list16.add(1);
 list16.add(2);
 list16.add(3);
 list16.add(4);

 var resultList16 = list16.elementAt(3);
 print(resultList16); //3
 
  • any((element) => (bool)) 判断List中是否任意一个元素符合条件赛选
 List<int> list17 = List();
 list17.add(1);
 list17.add(2);
 list17.add(3);
 list17.add(4);
 list17.add(5);
 //every((element)=>(bool)) 判断List中是否有元素符合参数函数
 bool resultList17 = list17.any((element) => (element >3));//判断List元素中是否有任意一个元素满足给定的条件,如果满足则返回true,否则返回flase
 print(resultList17); //true

  • firstWhere((element) =>(bool)) 返回第一个满足条件的元素
 List<int> list18 = List();
 list18.add(1);
 list18.add(2);
 list18.add(3);
 list18.add(4);
 list18.add(5);
 list18.add(1);
 list18.add(2);
  var resultList18 = list18.firstWhere((element) => (element > 2)); //找不到则会报错 Bad state: No element
  print(resultList18); //3
  • int lastIndexWhere(bool test(E element), [int start]); 返回第一个满足条件的元素下标,start表示从第几个下标开始查找,不存在则返回-1
  List<int> list19 = List();
  list19.add(1);
  list19.add(2);
  list19.add(3);
  list19.add(4);
  list19.add(5);

  var resultList19 = list19.indexWhere((element) => (element >3)); //不存在则返回-1
  var resultList191 = list19.indexWhere((element) => (element > 4),2);

  var resultList192 = list19.lastIndexWhere((element) => (element > 5));
  var resultList193 = list19.lastIndexWhere((element) => (element > 2),1);

  print(resultList19);//3
  print(resultList191);//4
  print(resultList192);//-1  (从索引 2 (即元素 3 )开始查找大于 4 的元素,最终会返回 -1 ,因为从索引 2 往后没有这样的元素)

  print(resultList193);//-1

  • lastWhere(bool test(E element), {E orElse()}) 从后往前查找,返回第一个满足条件的元素
   List<int> list20 = List();
   list20.add(1);
   list20.add(1);
   list20.add(3);
   list20.add(4);
   list20.add(5);
   var resultList20 = list20.lastWhere((element) => element >2);

   var resultList21 = list20.lastWhere((element) => element > 6,orElse:()=>(66));

   print(resultList20); //5
   print(resultList21); //66

  • forEach 遍历List中的每个元素 进入文档内查看,forEach方法内部其实也是forIn方法进行遍历
  List list21 = List();
  list21.add(1);
  list21.add(2);
  list21.add(3);
  list21.add(4);
  list21.add(5);
  list21.forEach((element) { //遍历时不可以add或remove,但是可以修改element内的值
    element += 1; //这里修改了element的值,但是遍历完,list21里面的值是不变的 
    print(element); //2,3,4,5,6;
    list21[1] = 66;
    list21[2] = 77;
  });
  print(list21); //[1, 66, 77, 4, 5]
  for (var list21Element in list21) {
     print(list21Element); // 1, 66, 77, 4, 5;
  }
  
  • fold(T initialValue, T combine(T previousValue, E element)) 根据现有的List和给定的initialValue,指定一个参数函数规则,对List每个元素做操作,并将结果返回
  List<int> list22 = [1,2,3,4,5,6];
  var resultList22 = list22.fold(2, (a, element) => (a * element)); //2 *(1*2*3*4*5*6)
  var resultList221 = list22.fold(2, (a, element) => (a + element)); // 2+(1+2+3+4+5+6)
  print(resultList22);//1440
  print(resultList221);//23
 
  • reduce(E combine(E value, E element)) 用指定的函数对元素做连续操作,将结果返回
  List<int> list23 = [1,2,3,4,5,6];
  var resultList23 = list23.reduce((a, b) => (a +b )); //1+2+3+4+5+6
  var resultList231 = list23.reduce((a, b) => (a * b)); //1*2*3*4*5*6
  print(resultList23);//21
  print(resultList231);//720

  //skip(count) 越过count个元素后,开始返回Iterable;
  List<int> list24 = [1,2,3,4,5];
  Iterable<int> resultList24 = list24.skip(2);
  print('$resultList24,${list24.runtimeType}');//(3, 4, 5),List<dynamic>
 
  • skipWhile(bool test(E value)) 根据参数函数,找到第一个不符合条件的元素,然后将其及以后的元素返回,如果都符合就返回一个空List,如果都不符合则全部返回
   List list25 = [3,1,2,4,5,6];
   Iterable resultList25 = list25.skipWhile((value) => (value > 1));
   print(resultList25);//[]
   
  • take(int count) 从0 - count 获取元素 并返回
  • takeWhile(bool test(E value)) 从0 开始获取,直至第一个不符合函数的元素,将其前面的元素都返回
   List list26 = [2,4,5,6,1];
   var resultList26 = list26.take(2);
   var resultList261 = list26.takeWhile((value) => value > 1.2);
   print('$resultList26,${resultList26.runtimeType}'); //(2, 4),SubListIterable<dynamic>
   print('$resultList261,${resultList261.runtimeType}'); //(2, 4, 5, 6),TakeWhileIterable<dynamic>
  • where(bool test(E element)) => WhereIterable(this, test) 根据指定的函数筛选,符合条件的元素组成新的Iterable
   List list27 = [3,1,0,5,7];
   Iterable resultList27 = list27.where((element) => element >2);
   print(resultList27); //(3, 5, 7)
  • singleWhere(bool test(E element), {E orElse()}) 根据函数找出唯一的元素,如果不唯一,则报错:Too many elements
  List list28 = [1,3,2,5,8];
  var resultList28 = list28.singleWhere((element) => (element >7),orElse:()=>(7));
  print(resultList28);//8
  • whereType() 从无指定类型的List中,筛选出指定类型的数据
  List list29 = [1,9,8,2,7,1.11,'abc'];
  Iterable<int> resultList29 = list29.whereType();
  Iterable<double> resultList291 = list29.whereType();
  Iterable<String> resultList292 = list29.whereType();
  print('$resultList29,$resultList291,$resultList292'); //(1, 9, 8, 2, 7),(1.11),(abc)
  • cast() 将List的泛型提升到期祖父类
  List<String> list30 = ['aa','bb','cc','dd'];
  List<Object> list31 = list30.cast();
  list31.add('ff');
  print('$list31,${list31.runtimeType}'); //[aa, bb, cc, dd],CastList<String, Object>
  
  • expand() 根据现有的List,指定一个规则,生成新的List\
 List list32 = [1,4,3,6];
 var resultList32 = list32.expand((element) => ([element +1,element +2]));
 print('$resultList32,${resultList32.runtimeType}'); //(2, 3, 5, 6, 4, 5, 7, 8)  ExpandIterable<dynamic, dynamic>
 
在这段代码中,expand 方法对列表 list32 中的每个元素进行操作。
对于列表中的元素 1,通过给定的函数计算得到 [1+1, 1+2],即 [2,3];对于元素 4,得到 [4+1, 4+2],即 [5,6];对于元素 3,得到 [3+1, 3+2],即 [4,5];对于元素 6,得到 [6+1, 6+2],即 [7,8]。
  • toSet() 将List转化为Set 并去除后面重复的元素
  List list33 = [1,3,2,7,6,1,2];
  Set set33 = list33.toSet();
  print('$set33,${set33.runtimeType}'); //{1, 3, 2, 7, 6},_CompactLinkedHashSet<dynamic>
 
  • asMap() 将List转化为Map 索引为key,元素为value
  List list34 = [1,2,3,6,7,9];
  Map map34 = list34.asMap();
  print('$map34,${map34.runtimeType}'); //{0: 1, 1: 2, 2: 3, 3: 6, 4: 7, 5: 9},ListMapView<dynamic>
  
  • shuffle() 将List内元素重新随机排列,并且该函数没有返回值,直接修改该List
  List list35 = [9,1,2,5,3];
  list35.shuffle();
  print('$list35'); //[9, 2, 3, 1, 5]

  • sort() List自身排序
  List list36 = [1,5,6,7,8,8,9,3,8,9,8];
 //  list36.sort();
 //  print(list36); //[1, 3, 5, 6, 7, 8, 8, 8, 8, 9, 9]
  list36.sort((a,b) =>(a>b ? 1:-1));
  print(list36);//[1, 3, 5, 6, 7, 8, 8, 8, 8, 9, 9]
  
  • sublist(int start, [int end]) 截取List 返回截取后的List
 List list37 = [2,5,1,7,9,10];
 var result37 =  list37.sublist(2);
 print('$result37,${result37.runtimeType}'); //[1, 7, 9, 10],List<dynamic>
 var result371 = list37.sublist(1,3);
 print('$result371,${result371.runtimeType}'); //[5, 1],List<dynamic>

  • getRange(int start, int end) 在List 中截取 start-end 之间
 List list38 = [8,9,1,0,3,5];
 var resultList38 = list38.getRange(1, 3);
 print('$resultList38,${resultList38.runtimeType}'); //(9, 1),SubListIterable<dynamic>
 
  • join()拼接字符,返回String类型
  List list39 = ['a','cc','fc','xx'];
  var resultList39 = list39.join('-');
  print('$resultList39,${resultList39.runtimeType}'); //a-cc-fc-xx,String

  • 清除所有元素 clear();
 //清除所有元素 clear()
  List list40 = ['c','b','z'];
  list40.clear(); //清除所有元素  如果是固定长度的则会报异常2
  print('$list40,${list40.runtimeType}'); //[],List<dynamic>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容