一,初始化List
- 非固定長度list
var testList = List(); print(testList.length);//輸出0
- 固定長度List
var testList2 = List(2); print(testList2.length);//輸出2
- 元素類型固定:
var testList3 = List<String>(); testList3.add("哈哈哈"); //testList3.add(1);//報錯,1不是String類型
- 直接賦值
var testList4 = [123,2312]; print(testList4.length); var testList5 = [true,"嘎嘎嘎",1]; testList5.add(1.6);//可以添加
二,常用字段
- length屬性,返回隊列長度
var testList6 = [1,"2",3,34532,555]; //length屬性,返回隊列長度 print(testList6.length);
- isEmpty屬性,返回列表是否為空
//isEmpty屬性,返回列表是否為空 print(testList6.isEmpty);
- isNotEmpty屬性,返回列表是否有元素
//isNotEmpty屬性,返回列表是否有元素 print(testList6.isNotEmpty);
- first獲取List中的第一個元素
//獲取List中的第一個元素 print("獲取list中的第一個元素${testList6.first}");
- last獲取List中的最后一個元素
//獲取List中最后一個元素 var testList = [1,2,3,4]; testList.add(14); testList.add('111'); print(testList.last);
- [index] 獲取List中某個位置上的元素(index為位置索引)
//獲取List中某個位置上的元素 var testList = [1,2,3,4]; testList.add(14); testList.add('111'); print(testList[2]);
三,數組(List)增,刪,改,查
- 添加數據
- 添加一條數據
//添加一條數據 var testList = List(); testList.add(14); testList.add('111');
- 向規定長度的數組添加數據
- 錯誤的方法
//下面的程序會報錯“Unsupported operation: Cannot add to a fixed-length list”固定長度的list不能通過add添加數據 var testList = List(3); testList.add(14); testList.add('111');
-
正確的添加方法
//固定長度的List使用以下方式可以設置數據 var testList = new List(3); testList[0] = '雷鋒'; testList[1] = '18'; testList[2] = '好人'; print(testList[2]);
- 錯誤的方法
- 添加全部元素
//把一個數組元素全部添加到另外一個數組里 var testList1 = new List(); var testList2 = ['雷鋒','18','好人']; testList1.addAll(testList2); print(testList1.length);
- 向指定位置添加元素
//向指定位置添加元素,如果位置越界就會報錯 var testList = ['雷鋒','18']; testList.insert(2,'好人'); print(testList.length);
-
向指定位置添加一個新的List,第二個參數為實現了Iterable接口的對象均可
//向指定位置添加一個新的List,第二個參數為實現了Iterable接口的對象均可 var testList1 = ['雷鋒','18']; var testList2 = ['焦裕祿','45']; testList1.insertAll(2,testList2); print(testList1.length);
-
將另外一個實現了iterabe接口的數據拼接到當前的List后面
//將另外一個實現了iterabe接口的數據拼接到當前的List后面 Set testSet = Set(); testSet.add(123); testSet.add(123); testSet.add(123); var testFollowedBy = testList6.followedBy(testSet); print("testFollowedBy ${testFollowedBy}");
- 添加一條數據
- 刪除數據
- 刪除指定元素
//刪除指定元素 testList.remove("哈哈哈"); print(testList);
- 刪除指定元素
-
- 刪除最后一個元素
//刪除最后一個元素 testList.removeLast(); print(testList);
-
刪除指定位置的元素
//刪除指定位置的元素 testList.removeAt(testList.length - 1); print(testList);
-
刪除指定區域的元素
//刪除指定區域的元素 testList.removeRange(0,1); print(testList);
-
下面這個方法是將列表List中的toString之后的字符串的長度等於3的元素全部刪除
//下面這個方法是將列表List中的toString之后的字符串的長度等於3的元素全部刪除 testList6.removeWhere((item) => item.toString().length == 3); print("刪除列表中toString后長度為3的元素:==> $testList6");
- 刪除最后一個元素
- 修改數據
-
設置元素,下面的方法將testList6中的第一個和第二個元素設置為testList中的元素
//設置元素,下面的方法將testList6中的第一個和第二個元素設置為testList中的元素 //如果testList中的元素個數不夠需要替換的元素個數,會報錯 //如果testList中的元素個數大於需要替換的元素個數,可以通過設置第四個參數,表示跳過testList的前面幾個元素,默認為0 //如果設置了第四個參數之后testList中的元素個數不夠需要替換的元素個數,會報錯 testList6.setRange(0, 2, testList,1); print("testList===>${testList}");
- 替換列表中的元素
//替換列表中的元素 //前兩個參數表示要替換列表中的元素的位置,如下面的表示將列表中第三個到第十個元素替換為testList5中的元素 //第二個參數<=列表的長度 //第一個參數<=第二個參數,否則會報錯 //就是list會首先刪除第一個參數到第二個參數之前的元素,然后將需要替換的list添加在第一個參數的位置。 print(testList6.length); testList6.replaceRange(10, 10, testList7); print(testList6);
- 使用一個值替換List中的指定位置的全部值
//使用一個值替換List中的指定位置的全部值 //比如下面的操作結果就是將List中第三個和第四個元素使用item的值替換 var item ="哼哼哼"; testList6.fillRange(3, 5,item); print("fillRange item ===>$item"); print(testList6);
- 設置list列表中的元素
//設置list列表中的元素 //第一個參數表示從第幾個元素開始 //下面的例子表示從第二個位置開始將后面的tetsList7.length個元素替換為testList7中的元素 //如果第一個參數+第二個參數.length大於要修改的list的length會報錯 print(testList6); testList6.setAll(2, testList7); print("setAll() ===> $testList6");
-
- 查詢操作
- 截取一個List中的其中幾個元素,第一個參數表示開始的位置,第二個參數為可選參數,表示結束的位置
//截取一個List中的其中幾個元素,第一個參數表示開始的位置,第二個參數為可選參數,表示結束的位置 //如果第二個參數大於被截取List的長度,會報錯。 var subList = testList6.sublist(0,3); print("截取到新的List==> ${subList}");
-
獲取指定位置區間的元素,並返回一個新的list,和subList的區別是subList返回一個新的List,而getRange返回一個實現了Iterable接口的對象
//獲取指定位置區間的元素,並返回一個新的list,和subList的區別是subList返回一個新的List,而getRange返回一個實現了Iterable接口的對象 //返回一個實現了Iterable接口的對象 var rangeList = testList6.getRange(5,10); print("rangeList===>${rangeList}"); print(testList6);
- 將滿足條件的元素保留下來,不滿足條件的元素刪除
//將滿足條件的元素保留下來,不滿足條件的元素刪除 //如下面的例子是將元素中字符長度=3的元素保存下來 testList6.retainWhere((obj) => obj.toString().length == 3); print(testList6);
- 查看元素最后一次出現的位置
//查看元素最后一次出現的位置 //第二個參數為可選參數,表示查找的位置 //如果不傳,默認查找全部的List //如果傳遞了第二個值,則從0查找到第二個值所指定的位置 //沒有查找到的話返回-1 //第二個值可以大於List的length //第二個參數用start來命名,可以認為這個方法是從后向前開始查找,這樣就很好理解start表示的是開始位置了。 testList6.insert(4, "嘻嘻嘻"); testList6.add("哼哼哼"); print(testList6); var testPosition = testList6.lastIndexOf("哼哼哼",testList6.length + 100); print("testPosition ====> $testPosition");
- 元素的索引,沒有找到元素會返回-1
//元素的索引,沒有找到元素會返回-1 //可以和上面的lastIndexof形成對比, //第二個參數可以指定查找的范圍 print(testList6.indexOf("哼哼哼",5));
- 遍歷查詢有沒有滿足條件的數據,如果有就返回true,沒有就返回false
//遍歷查詢有沒有滿足條件的數據,如果有就返回true,沒有就返回false //參數傳入一個返回bool的函數 var testExit = testList6.any((item) => checkData(item)); print("textExit==>$testExit");
- 遍歷查詢是不是所有的數據都滿足這個條件,如果有不滿足的數據,直接返回false
//遍歷查詢是不是所有的數據都滿足這個條件,如果有不滿足的數據,直接返回false bool testEvery = testList6.every((item) => checkData(item)); print("testEvey ===> $testEvery");
- 截取一個List中的其中幾個元素,第一個參數表示開始的位置,第二個參數為可選參數,表示結束的位置
- 對比any和every方法:
checkData()用來查看傳入的參數是否為空,如果參數為空,就返回true,如果參數不為空,就返回false- 結合any和every方法的源碼:
any方法的源碼中,遍歷查詢是否有滿足條件的元素,如果找到滿足條件的元素,那么直接返回true,
every方法的源碼中遍歷查詢有沒有不滿足條件的元素,如果發現有不滿足的元素,直接返回false - 針對checkData()方法來說
any在遍歷的時候會將每一個元素傳入checkData中,如果有一個元素是空的,此時就會直接返回true,目前返回了false,說明在testList6中沒有為空的元素
every在遍歷的時候將每一個元素傳入checkData中,查看是否全部元素都是空的,如果其中有一個元素不是空的,就直接返回false,因此在checkData中由於第一個元素就不是空的,所以不滿足每一個元素都是空的條件,直接返回false
- 結合any和every方法的源碼:
-
- 這個方法相當於查看List中的數據類型是不是都是指定的數據類型,如果發現List中存在不是<>中指定的數據類型就會報錯
//這個方法相當於查看List中的數據類型是不是都是指定的數據類型, //如果發現List中存在不是<>中指定的數據類型就會報錯 print(testList6); List<String> testStringList = testList6.cast<String>(); print("testIntList ===> $testStringList");
-
查看List中是否存在指定元素
//查看List中是否存在指定元素 print("是否存在哼哼哼${testList6.contains("哼哼哼")}");
-
查找指定位置的元素
//查找指定位置的元素 //傳入的參數必須是合法的,也就是必須在是int類型,然后必須在0到list.length之間 //從源碼也可以看出:會首先判斷傳入的蠶食是否是int類型,然后會判斷參數是否小於0,接着執行循環,開始遍歷,如果遍歷完了還沒找到指定的位置 //就說明這個指定的位置有問題。 var position = testList6.elementAt(testList6.length - 1); print("position ====> $position");
-
可以理解為將一個一維數組擴展為二維數組
//可以理解為將一個一維數組擴展為二維數組 var testList9 = testList2.expand((item) => [item,item.toString() + "啊"].toList()); print("test expand ===> $testList9"); //同時也可已經一個二維數組解封,解封時需要數組里面的ietm仍然是一個list var testList10 = [[12,12],[22,44]]; var testList11 = testList10.expand((item) => item.toSet()); print("test expand ===> $testList11");
-
滿足條件的第一個元素
//滿足條件的第一個元素 //從源碼可以看出,firstWhere方法會首先從列表中查找有沒有滿足條件的item,如果沒有找到,會判斷有沒有 //傳入第二個參數,如果第二個參數不為空,就執行第二個參數的方法,如果第二個參數為空,就直接出錯。 var testFirstWhere = testList6.firstWhere((item) => checkExitHa(item),orElse: getHi); print("滿足條件的第一個元素:$testFirstWhere");
-
有條件地查詢所需數據的位置
//有條件地查詢所需數據的位置 //第一個參數是返回bool值的函數,第二個參數是起始位置 //下面的例子是找出列表中元素toString之后長度是2的元素出現的位置 testList6.insert(1, 23); testList6.add(34); int testIndexWhere1 = testList6.indexWhere((item) => getLength2(item.toString())); int testIndexWhere2 = testList6.indexWhere((item) => getLength2(item.toString()),3); print("testIndexWhere1 ${testIndexWhere1}");//輸出1 print("testIndexWhere2 ${testIndexWhere2}");//輸出10
-
有條件的查詢需要查詢的數據最后一次出現的位置
//有條件的查詢需要查詢的數據最后一次出現的位置 //這個方法具體的執行可以理解為倒序執行,從最后一個元素向前開始查找符合要求的數據 //第二個參數就是指定開始執行的位置 int testLastIndexWhere1 = testList6.lastIndexWhere((item) => getLength2(item.toString()));//輸出10 int testLastIndexWhere2 = testList6.lastIndexWhere((item) => getLength2(item.toString()),testList6.length - 2); //輸出1 print("testLastIndexWhere ${testLastIndexWhere1}"); print("testLastIndexWhere ${testLastIndexWhere2}");
-
返回滿足條件的元素,第一個參數指定需要滿足的條件,第二個參數為可選參數,指定不滿足條件的時候需要執行的操作
//返回滿足條件的元素,第一個參數指定需要滿足的條件,第二個參數為可選參數,指定不滿足條件的時候需要執行的操作 print("\n ${testList6}"); var testLastWhere1 = testList6.lastWhere((item) => item.toString().length == 2 ? true : false);//沒有找到符合要求的數據就會報出異常,程序會Crash var testLastWhere2 = testList6.lastWhere((item) => item.toString().length == 1 ? true : false,orElse: getHi);//沒有找到符合要求的數據就會去執行getHi方法,返回getHi方法執行結果 print("testLastWhere: ${testLastWhere1}"); print("testLastWhere: ${testLastWhere2}");
-
檢查List中是否只有一個元素,如果只有一個元素會輸出這個元素,如果沒有元素會拋出沒有數據的異常,如果多於一個元素,會拋出too many elemets異常
//檢查List中是否只有一個元素,如果只有一個元素會輸出這個元素,如果沒有元素會拋出沒有數據的異常,如果多於一個元素,會拋出too many elemets異常 List testList13 = List(); testList13.add(123); print("\n testSingle:${testList13.single}");
-
有條件的查詢滿足條件的元素是否只出現了一次
//有條件的查詢滿足條件的元素是否只出現了一次 //第二個參數是可選參數,用於當第一個條件不滿足時執行的操作 //具體執行的邏輯如下: //在List中查找滿足條件的元素 //如果沒有找到滿足條件的元素,查看orElse是否設置,如果設置,就執行orElse設置的函數 //如果找到了滿足條件的元素,並且滿足條件的元素只有一個,輸出這個元素的值 //如果找到了滿足條件的元素,但是滿足條件元素的數量大於一個,就會拋出too many elements 異常,此時程序會直接crash,不會執行orElse設置的函數 testList6.add(1); var testSingleWhere = testList6.singleWhere((item) => item.toString().length == 1,orElse: getHi); print("\ntestSingleWhere ${testSingleWhere}, type is ${testSingleWhere.runtimeType} \n");
-
取出前面多少個元素放在新的list中
//取出前面多少個元素放在新的list中 var testTake = testList6.take(3); print("\ntestTake:${testTake},and type is ${testTake.runtimeType}\n");
-
返回List中滿足條件的元素的惰性迭代
//返回List中滿足條件的元素的惰性迭代 //從第一個元素開始查找符合條件的元素,一直查找到不符合條件的元素結束 //注意這里是惰性迭代,也就是說如果滿足條件的元素並不是按順序排列的,分布在列表的任何位置,那么 //這個方法查找只會查找處前面符合條件的元素,中間發現有元素不符合條件就會停止查找,即使后面還有符合條件的元素也不會再去查找了 print(testList6); var testTakeWhile = testList6.takeWhile((item) => item.toString().length == 3); print("\ntestTakeWhile:${testTakeWhile},and type is ${testTakeWhile.runtimeType}\n");
-
創建一個可包含此列表的新的列表
//創建一個可包含此列表的新的列表 //growable是一個可選參數,默認為true,表示創建一個可變長度的列表 //如果傳入false,則是一個固定長度的列表 var testToList = testList6.toList(growable: true); var testToList1 = testList6.toList(growable: false); //testToList1.add("123");//異常:testToList是一個固定長度的列表,無法進行添加數據的操作 //testToList1.removeAt(0);//異常:固定列表無法進行刪除數據的操作 print("\ntestToList: ${testToList},and type id ${testToList.runtimeType}\n"); print("\ntestToList1: ${testToList1},and type id ${testToList1.runtimeType}\n");
-
查找列表中滿足條件的數據,條件由傳入的函數參數決定
//查找列表中滿足條件的數據,條件由傳入的函數參數決定 var testWhere = testList6.where((item) => item.toString().length == 3); print("\ntestWhere:${testWhere} and type is ${testWhere.runtimeType}\n");
-
取出List列表中指定類型的元素,並放入新的列表中
//取出List列表中指定類型的元素,並放入新的列表中 //如下面是將List中數據類型為String的元素全部取出放入到新的List中 print(testList6); var testWhereType= testList6.whereType<String>(); print("\ntestWhereType:${testWhereType},and type is ${testWhereType.runtimeType}\n");
- 這個方法相當於查看List中的數據類型是不是都是指定的數據類型,如果發現List中存在不是<>中指定的數據類型就會報錯
四,其它操作方法
- 排序
//排序 testList6.sort((a,b) => a.toString().length.compareTo((b.toString().length))); print("根據字符的長度排序:${testList6}");
- 將List倒序排列之后賦給一個新的list,
//將List倒序排列之后賦給一個新的list, var testList8 = testList6.reversed; print("倒序排列List===> $testList8");
- 根據position將list轉換為對應的map Map<int,Element>
//根據position將list轉換為對應的map Map<int,Element> //也就是[0:element ......] var testMap = testList6.asMap(); print("testMap ====> $testMap");
- 將List列表中的順序打亂
//將List列表中的順序打亂 //可以傳入一個Random對象作為可選參數 print(testList6); testList6.shuffle(); print("shuffle ===> $testList6");
- 對列表中的數據做指定的操作
//對列表中的數據做指定的操作 //下面的操作是在列表開始的時候加上“哈哈哈”這個字符串然后將后面的元素都拼接起來 print(testList6); String str = testList6.fold("哈哈哈",(pre,item) => pre + item ); print("test fold ====> $str");
- List循環輸出數據
//List循環輸出數據 testList6.forEach((item) => print(item));
- 將List作為Iterator進行使用
//將List作為Iterator進行使用 print(testList6); var testIterator = testList6.iterator; while(testIterator.moveNext()){ print("testIterator: ${testIterator.current}");//輸出當前值 }
- 使用join中的指定的字符串分隔List中的每個元素,並將其作為字符串返回
//使用join中的指定的字符串分隔List中的每個元素,並將其作為字符串返回 //通過源碼可以看出,首先會將List作為Iterator來使用 //如果Iterator中沒有元素,就直接返回一個空的字符串,注意不是null,而是 "" //接着判斷join()中的參數如果為空或者為 "",直接將Iterator中的元素拼接然后返回 //如果join()中有參數,就是用join中的參數作為分隔符拼接Iterator中的元素然后返回 String testJoin1 = testList6.join(); String testJoin2 = testList6.join(","); String testJoin3 = testList6.join("噠噠噠"); print("join中無參數:${testJoin1}"); print("使用,作為分隔符${testJoin2}"); print("想要在最后一個元素之前的元素后面都添加一個字符串然后返回${testJoin3}");
- 下面的map方法和Map沒有任何關系,執行結果和match更像
//下面的map方法和Map沒有任何關系,執行結果和match更像 //這個方法的執行邏輯是將List中的每個元素拿出來和map(f)中傳入的f函數條件進行比較 //如果符合條件就會返回true,否則就會返回false //同時返回的數據也是實現了Iterable的接口,注意是Iterable而不一定是List var testMap1 = testList6.map((item) => item.toString().length == 2); print("\ntestMap1:${testMap1}"); print("testMap1: ${testMap1.runtimeType} \n");
- 這個方法可以用,但是不知道具體的應用實例
//這個方法可以用,但是不知道具體的應用實例 //這個方法首先會傳入列表的第一個和第二個數據,對這兩個數據進行傳入的函數操作,然后會將函數的返回值作為下一次操作的第一個參數 print("${testList6}"); var testReduce = testList6.reduce((value,element) => checkReduce(value.toString(), element.toString())); print("\ntestReduce ${testReduce} type is ${testReduce.runtimeType}\n");
- 跳過前面多少個元素,返回一個SubListIterable,和subList的操作相似
//跳過前面多少個元素,返回一個SubListIterable,和subList的操作相似 print(testList6); var testSkip = testList6.skip(2); print("\ntestSkip: ${testSkip}, and type is ${testSkip.runtimeType}\n");
- 跳過列表中滿足條件的前面的元素,從第一個元素開始查找,一直查找到不滿足條件的元素為止
//跳過列表中滿足條件的前面的元素,從第一個元素開始查找,一直查找到不滿足條件的元素為止 //條件由傳入的函數參數決定 testList6.insert(0, "呸呸呸"); var testSkipWhile = testList6.skipWhile((item) => item.toString().length == 3); print("\ntestSkipWhile:${testSkipWhile},and type is ${testSkipWhile.runtimeType}\n");
- 注意Set為沒有順序且不可重復的列表,數據轉換到set之后圓List中的重復的數據會被刪掉
//注意Set為沒有順序且不可重復的列表,數據轉換到set之后圓List中的重復的數據會被刪掉 print(testList6); Set testSet1 = testList6.toSet(); print("\ntestSet1:${testSet1} and type is ${testSet1.runtimeType}\n");