一,概述    

  通常来讲,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);//
      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);//
      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)和直接赋值。

  

 

【dart学习】之字典(Map)的相关方法总结的更多相关文章

  1. [dart学习]第三篇:dart变量介绍 (二)

    本篇继续介绍dart变量类型,可参考前文:第二篇:dart变量介绍 (一) (一)final和const类型 如果你不打算修改一个变量的值,那么就把它定义为final或const类型.其中:final ...

  2. Dart 学习资料

    Dart 学习资料: 学习资料 网址 Dart 编程语言中文网 http://dart.goodev.org/ Dart 官方包仓库 https://pub.dartlang.org/ 你想了解的Da ...

  3. Python3 字典(map)

    ayout: post title: Python3 字典(map) author: "luowentaoaa" catalog: true tags: mathjax: true ...

  4. 《python基础教程(第二版)》学习笔记 字典(第4章)

    <python基础教程(第二版)>学习笔记 字典(第4章)创建字典:d={'key1':'value1','key2':'value2'}lst=[('key1','value1'),(' ...

  5. Go学习笔记之Map

    Go学习笔记之Map Map 引用类型,哈希表.map的key必须可以比较相等,除了slice, map, function的内建类型都可以作为key.struct类型不包含上述字段,也可作为key. ...

  6. Dart学习笔记-运算符-条件表达式-类型转换

    Dart学习笔记-运算符-条件表达式-类型转换 一.运算符 1.算术运算符 + (加)- (减)* (乘)/ (除)~/ (取整) %(取余) 2.关系运算符 == (等等) != (不等) > ...

  7. Dart学习笔记-变量常量数据类型

    变量和常量 1.变量的定义 main() { var t_str = 'hello world'; var t_num = 123456; String t_str2 = '你好,我很高兴'; int ...

  8. Python 2.7 学习笔记 字典(map)的使用

    python中的字典,就是通常说的map,即 key/value集合的数据结构. 本文来介绍下在python下如何使用字典. 对于map这种数据结构能干什么,我们就不说了,这是一个常见的数据结构,我们 ...

  9. 【Dart学习】--之Iterable相关方法总结

    一,概述 按顺序访问的值或元素的集合, List集合也是继承于Iterable List和Set也是Iterable,dart:collection库中同样有很多 部分Iterable集合可以被修改 ...

随机推荐

  1. delphi 加入超链接

    delphi 加入超链接//在uses中加入ShellAPI//通过该lpFile参数可以实现链接到主页或ftp站点 ShellExecute(handle,nil,pchar('http://www ...

  2. CTF | bugku | 速度要快

    检查源码时发现有 <!-- OK ,now you have to post the margin what you find --> 检查响应头发现有 flag: 6LeR55qE6L+ ...

  3. 某些 UI效果 实现思路

    一.日历组件: https://blog.csdn.net/amork/article/details/7257212 二.瀑布流 三.轮播图:轮播图已经用的很多了,结构也简单就不去将了. 四.分页组 ...

  4. sql查询某个时间内的数据

    hour) 七天之前的数据 SELECT * FROM commodity_order where create_time <= (now()-INTERVAL 7 DAY) order by ...

  5. xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance

    运行xcode命令报错: sh-3.2# xcodebuild xcode-select: error: tool 'xcodebuild' requires Xcode, but active de ...

  6. Eclipse对web项目设置请求路径(与项目名称不同)

    可以在下图位置,进行修改 也可以修改项目的路径下的.settings文件夹下的org.eclipse.wst.common.component的value属性 <property name=&q ...

  7. 抽象类 抽象方法 abstract

    abstract: * abstract修饰类: 抽象类 * > 此类不能被实例化 * > 抽象类中一定要有构造器, 便于子类对象实例时调用(涉及子类对象实例化过程) * > 开发中 ...

  8. Android深度探索-卷1第四章心得体会

    这一章的和三章的git用法有联系,so,吧上一章的git基本用法搞好了再来,具体的方法就是看书上网查,这里就不做详细步骤介绍了.这章就有点意思了,是源码的下载和编译,有能看的,能自己鼓捣的,本章介绍的 ...

  9. js获取下拉框的value值

    var Resultstr=""; var param = { action: "MoneyList" };//参数拼接 $.ajax({ type: &quo ...

  10. Git的安装配置

    Git是什么 Git是一款免费.开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. 与常用的版本控制工具CVS.Subversion等不同的是它采用了分布式版本库的方式,不必 ...