一,概述    

  通常来讲,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. 企业打开云HBase的正确方式,来自阿里云云数据库团队的解读

    一.HBase的历史由来 HBase是一个开源的非关系型分布式数据库(NoSQL),基于谷歌的BigTable建模,是一个高可靠性.高性能.高伸缩的分布式存储系统,使用HBase技术可在廉价PC Se ...

  2. 阿里云HPC助力新制造 | 上汽仿真计算云SSCC

    随着上汽集团与阿里云的合作开展,阿里云各项技术逐步深入到上汽汽车研发领域的核心业务实现落地.其中上海汽车集团股份有限公司乘用车分公司(以下简称上汽乘用车)与阿里云共建的仿真计算混合云就是新制造产业升级 ...

  3. LDD3 第10章 中断处理

    各种硬件和处理器打交道的周期不同,并且总是比处理器慢.必须有一种可以让设备在产生某个事件时通知处理器----中断. 中断仅仅是一个信号,如果硬件需要,就可以发送这个信号.Linux处理中断方式和用户空 ...

  4. CF 1172E Nauuo and ODT ——LCT

    题目:http://codeforces.com/contest/1172/problem/E LCT好题. 考虑对每个颜色求出 “不是该颜色的点组成的连通块的 siz2 之和” .每个颜色用 LCT ...

  5. Majordomo Info VGER.KERNEL.ORG

    This is VGER.KERNEL.ORG Majordomo Info The mission of vger.kernel.org is to provide email list servi ...

  6. codeforces gym100418J

    题目简述 给定N 求1到N中有多少个幸运数字 幸运数字的定义为 这个数能被它二进制表示下1的个数整除 其中(1 ≤ N ≤ 1019) -------------------------------- ...

  7. laravel 向多视图及所有视图传递数据变量

    向单个视图传递变量 1.使用with()方法 : view('user.lists')->with('title',$title); 2.直接view()传参: view('user.lists ...

  8. Vue2.0---vuex初理解

    先来一张vuex的帅照 第一眼看到这张图片我内心是万匹草泥马飞过. 简单理解:  vuex:一个可以全局被使用的状态管理的“仓库”:state.js中定义初始状态,通过action去触发mutatio ...

  9. centos7 安装 gitlab 服务器

    https://www.cnblogs.com/wenwei-blog/p/5861450.html 标签: centos7 git安装 git gitlab 我这里使用的是centos 7 64bi ...

  10. A - Max Sum Plus Plus (好题&&dp)

    A - Max Sum Plus Plus  I think you have got an AC in Ignatius.L's "Max Sum" problem. To be ...