【dart學習】之字典(Map)的相關方法總結


一,概述    

  通常來講,Map是一個鍵值對相關的對象,鍵和值可以是任何類型的對象。每個鍵只出現一次,而一個值則可以出現多次。映射是動態集合。 換句話說,Maps可以在運行時增長和縮小。 dart:core庫中的Map類提供了相同的支持。

二,聲明

  • 不指定泛型(普通方式,不指定任何類型,這時testMap中K-V的類型均是dynamic )
  •     //直接賦值
        var map1 = {'aa':'aaa','bb':22,'cc':true}; 
        Map map2 = {'a':'a1','b':'b1'};  
    //間接賦值
        var map3 = new Map(); 
        map3['aa'] = 'aaa'; 
        Map map4 = new Map(); 
        map4['a'] = 'aaa';
  • 指定泛型(下面的例子表示Map的類型為<String,String>,初始化Map時map的類型為<String,String> ,如果類型不匹配或者不兼容就會導致程序crash)
        //直接賦值
        var map1 = <String,String>{'aa':'aaa','bb':'22','cc':'333'};
        Map map2 = <String,String>{'a':'a1','b':'b1','c':'c1'};
        
        //間接賦值
        var map3 = new Map<String,String>();
        map3['aa'] = 'aaa';
        Map map4 = new Map<String,String>();
        map4['a'] = 'a1';

 

  • 通過復制的形式
      /**
       * 不使用類型操作符,從另一個map中初始化新的map,此時新的map中含有另一個map中的資源
       */
      Map map1 = {'a':'a1','b':'b1','c':'c1'};
      Map map2 = Map.castFrom(map1);
      print(map2);
    
      /**
       * 強制使用指定類型初始化map
       * 下面的例子表示testMap1的類型為<num,String>,初始化Map時castFrom中map的類型為<int,String>
       * 如果類型不匹配或者不兼容就會導致程序crashh 
       */
      Map<int,String> map3 = {1:'a',2:'b',3:'c'};
      Map map4 = Map.castFrom<num,String>(map3);//這行代碼會出錯,主要原因是testMap是<dynamic,dynamic>類型的,但是這里需要的是<int,String>類型的map
      Map map5 = Map.castFrom<String,String>(map3);//這行代碼也會出錯,因為無法將<String,String>類型的map轉換為<int,String>類型的map
      Map map6 = Map.castFrom<int,String>(map3); //正確
  • 創建不可變的Map
    Map map6 = const {'one':'Android','two':'IOS','three':'flutter'};
      //在目標的map6創建(復制)新的不可修改map7
      Map map7 = Map.unmodifiable(map6);
      print(map7); 
      //輸出:{one: Android, two: IOS, three: flutter}
  • 根據list所提供的key value來創建map;
    List<String> keys = ['one','two']; 
    List<String> values = ['Android','IOS'];
    Map map9 = Map.fromIterables(keys, values);
    print(map9);

三,屬性

  Map<String,int> map6 = {"a":1,"b":2};
  •   length
    print(map6.length);//2  長度
  • isNotEmpty
    print(map6.isNotEmpty);//true  是否不為空
  • isEmpty
    print(map6.isEmpty);//false   是否為空   
  • keys
    print(map6.keys);//(a, b)   key的集合
  • values
    print(map6.values);//(1, 2)  value的集合
  • entries
    print(map6.entries);//(MapEntry(a: 1), MapEntry(b: 2))   map迭代的鍵值對集合 

四,方法

    • 新增一個key-value  

       Map<String,int> map7 = {"a":1,"b":2,"c":3,"d":4,"e":5};
      //新增一個key value
       map7["f"] = 6;//新增一個不存在的key
       print(map7);//{a: 1, b: 2, c: 3, d: 4, e: 5, f: 6} 

    • 修改一個key的value
      Map<String,int> map8 = {"a":1,"b":2,"c":3,"d":4,"e":5};
      map8["a"] = 11;
      print(map8);//{a: 11, b: 2, c: 3, d: 4, e: 5}
    • update() 對指定的key的value做出修改
       Map<String,int> map23 = {"a":1,"b":2,"c":3};
       int result3 = map23.update("a", (value)=>(value*2));//key存在  根據參數函數修改其值
       print(result3);//2
       print(map23);//{a: 2, b: 2, c: 3}
       int result4 = map23.update("d", (value)=>(value*2));//key不存在  報錯
       int result4 = map23.update("d", (value)=>(value*2),ifAbsent: ()=>(10));//key不存在  但有ifAbsent參數 返回ifAbsent函數的值  並添加到map中
       print(result4);//10
       print(map23);//{a: 2, b: 2, c: 3, d: 10}

       

    • updateAll() 根據參數函數的規則,批量修改map

          Map<String,int> map24 = {"a":1,"b":2,"c":3};
          map24.updateAll((String key,int value){
            return value*2;
          });//
          print(map24);//{a: 2, b: 4, c: 6}
          
          Map<String,int> map25 = {"a":1,"b":2,"c":3};
          map25.updateAll((String key,int value){
            if(key=="a"){return 10;}
            if(key=="b"){return 20;}
            return value*2;
          });//
          print(map25);//{a: 10, b: 20, c: 6}

    • remove() 刪除一個key
          Map<String,int> map9 = {"a":1,"b":2,"c":3,"d":4,"e":5};
          map9.remove("b");
          print(map9);//{a: 11, c: 3, d: 4, e: 5}

       

    • removeWhere() 根據條件批量刪除

      Map<String,int> map10 = {"a":1,"b":2,"c":3,"d":4,"e":5};
      map10.removeWhere((key,value)=>(value>3));//刪除掉 符合參數函數的keyvalue對
      print(map10);//{a: 1, b: 2, c: 3}
    • containsKey() 是否包含key  
         Map<String,int> map11 = {"a":1,"b":2,"c":3,"d":4,"e":5};
         print(map11.containsKey("a"));//true   是否包含key
         print(map11.containsKey("aa"));//false  是否包含key
    • containsValue() 是否包含value值
         Map<String,int> map17 = {"a":1,"b":2,"c":3};
         print(map17.containsValue(1));//true
         print(map17.containsValue(4));//false
    • forEach() 遍歷
          Map<String,int> map12 = {"a":1,"b":2,"c":3,"d":4,"e":5};
          map12.forEach((String key,int value){
           print("$key  $value");
            a  1
            b  2
            c  3
            d  4
            e  5
          });
    • 遍歷時修改value值
          Map<String,int> map13 = {"a":1,"b":2,"c":3};
          map13.forEach((String key,int value){
          print("$key  $value");
          map13["c"] = 4;
            a  1
            b  2
            c  4
          });

      注意:

      遍歷時,新增或刪除key  都會報錯
          Map<String,int> map14 = {"a":1,"b":2,"c":3};
          map14.forEach((String key,int value){
            print("$key  $value");
            map14["d"] = 4;//  報錯
            map14.remove("a");//  報錯
          });
  • 其它
    • map() 遍歷每個元素 根據參數函數,對keyvalue做出修改,可轉換成其他泛型的Map
        Map<String,int> map19 = {"a":1,"b":2,"c":3};
          Map<int,String> map20 = map19.map((String key,int value){
            return new MapEntry(value, key);
          });
         print(map20);//{1: a, 2: b, 3: c}
    • clear() 清空map
         Map<String,int> map15 = {"a":1,"b":2,"c":3};
         map15.clear();
         print(map15);//{}
    • addAll() 整體合並另一個map 泛型要一致
         Map<String,int> map16 = {"a":1,"b":2,"c":3};
         Map<String,int> other = {"a":1,"c":4,"d":7};
         map16.addAll(other);//key相同時value值后者覆蓋前者,前者不存在時則添加進來
         print(map16);//{a: 1, b: 2, c: 4, d: 7}
    • addEntries() 合並兩個map 如果key有重復,被合並的map的value覆蓋前者
          Map<String,int> map26 = {"a":1,"b":2,"c":3};
          Map<String,int> map27 = {"a":1,"b":4,"d":3,"e":5};
          map26.addEntries(map27.entries);
          print(map26);//{a: 1, b: 4, c: 3, d: 3, e: 5}
    • putIfAbsent() 存在key就獲取值,不存在則添加到map 然后返回值
          Map<String,int> map18 = {"a":1,"b":2,"c":3};
          int result = map18.putIfAbsent("a", ()=>(2));//存在
          print(result);//1   獲取key的值
          print(map18);//{a: 1, b: 2, c: 3}   map不變
          int result2 = map18.putIfAbsent("d", ()=>(2));//不存在
          print(result2);//2   獲取新的key的value
          print(map18);//{a: 1, b: 2, c: 3, d: 2}   map改變
    • cast() 泛型類型提升為其父祖類
          Map<String,int> map21 = {"a":1,"b":2,"c":3};
          Map<Object,Object> map22 = map21.cast();
          map22["d"]=33;
          print(map22);//{a: 1, b: 2, c: 3, d: 33}
  • 通用方法

    List、Set和Map有一些通用的方法。其中的一些通用方法都是來自於類Iterable。List和Set是iterable類的實現。

    雖然Map沒有實現Iterable, 但是Map的屬性keys和values都是Iterable對象。

    • 通用屬性 isEmpty和 isNotEmpty

      var testSet = Set.from(["a", "b", "c"]);
      var testList = [1, 2, 3, 4];
      var testMap = Map();
      
      print(testSet.isNotEmpty); // true
      print(testList.isEmpty); // false
      print(testMap.isEmpty); // true
      
      testMap.addAll({
      "zh": "china",
      "us": "usa"
      });
    • forEach方法

      testList.forEach((num) => print("I am num ${num}")); // I am num 1 等等
      testMap.forEach((k, v) => print("${k} is ${v}")); // zh is china 等等
    • iterable提供了 map 方法,來處理每一個集合中的對象,並返回一個結果

      var setIter = testSet.map((v) => v.toUpperCase());
      print(setIter); // (A, B, C)
    • 可以用toList和toSet將結果轉換成列表或者集合

      var listIter = testSet.map((v) => v.toUpperCase()).toList();
      print(listIter); // [A, B, C]
    • iterable提供了where方法,來過濾集合中的值,並返回一個集合

      var whereList = testList.where((num) => num > 2).toList();
      print(whereList); // [3, 4]。如果不用toList()則返回(3, 4)
    • iterable提供了any方法和every方法,來判斷集合中的值是否符合條件,並返回bool

      print(testList.any((num) => num > 2)); // true

五,總結

  1. 當Map的Key沒有指定類型時,Key類型不一致也不會報錯。
  2. Map里面的key不能相同。但是value可以相同,value可以為空字符串或者為null。
  3. 創建Map有兩種方式:通過構造器(new)和直接賦值。

  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM