Dart中Map的使用_ffa_ijj的博客-程序员宝宝_dart map

技术标签: Dart Map  Dart  

本篇文章总结了Dart中map的使用方式,由于map中的函数相对较少,没有做明确的顺序,代码如下:

void main(List<String> args) {
  print("这个demo用来演示Map中常用的属性和方法");
  //初始化Map
  //普通方式,不指定任何类型,这时testMap中K-V的类型均是dynamic
  Map testMap = Map();
  print("testMap: $testMap");
  testMap[1] = "哈哈哈";

  //强制使用指定类型初始化map
  Map testMap1 = Map<int,String>();

  //不使用类型操作符,从另一个map中初始化新的map,此时新的map中含有另一个map中的资源
  Map testMap2 = Map.castFrom(testMap);

  //强制使用指定类型初始化map
  //下面的例子表示testMap1的类型为<num,String>,初始化Map时castFrom中map的类型为<int,String>
  //如果类型不匹配或者不兼容就会导致程序crashh
  //Map testMap3 = Map.castFrom<num,String,int,String>(testMap);//这行代码会出错,主要原因是testMap是<dynamic,dynamic>类型的,但是这里需要的是<int,String>类型的map
  //Map testMap4 = Map.castFrom<int,String,String,String>(testMap);//这行代码也会出错,因为无法将<String,String>类型的map转换为<int,String>类型的map
  Map testMap3 = Map.castFrom<int,String,int,String>(testMap1);
  print("testMap3:$testMap3 and type is ${testMap3.runtimeType}");

  //无法使用指定参数类型,只能从另一个map中初始化一个新的map
  Map testMap4 = Map.from(testMap);
  print("testMap4:$testMap4 and type is ${testMap4.runtimeType}");

  //无法使用指定类型参数,从一个实现了Iterable接口的集合中初始化map
  var testList = List<MapEntry<int,String>>();
  testList.add(MapEntry(1,"哈哈哈"));
  testList.add(MapEntry(2,"嘻嘻嘻"));
  Iterable testIterable = testList.take(testList.length);
  Map testMap5 = Map.fromEntries(testIterable);
  print("testMap5:$testMap5,and type is ${testMap5.runtimeType}");


  //不支持指定类型,创建一个默认的map
  Map testMap6 = Map.identity();
  print("\ntestMap6:$testMap6,and type is ${testMap6.runtimeType}\n");

  Map testMap7 = Map.fromIterable(testIterable,key: (item) => item.toString()+"哈哈哈",value: (item) => item.toString()+"嘻嘻嘻");
  print("\ntestMap7:$testMap7,and type is ${testMap7.runtimeType}\n");

  //从一个可迭代的对象中获取key,从另一个可迭代的对象中获取value,然后使用两个Iterable创建出map
  var testList1 = List();
  var testList2 = List();
  testList1.add("one");
  testList1.add("two");
  testList1.add("three");
  testList1.add("one");
  testList2.add(1);
  testList2.add(2);
  testList2.add(3);
  testList2.add(4);
  Iterable testIterable1 = testList1.take(testList1.length);
  Iterable testIterable2 = testList2.take(testList2.length);
  Map testMap8 = Map.fromIterables(testIterable1, testIterable2);
  print("\ntestMap8:$testMap8, and type is ${testMap8.runtimeType}\n");

  //从另一个Map中创建一个新的Map对象
  Map testMap9 = Map.of(testMap1);
  print("\n通过Map.of创建Map对象:$testMap9,and type is ${testMap9.runtimeType}\n");

  //创建一个不可修改的基于散列的map
  Map testMap10 = Map.unmodifiable(testMap5);
  print("\n通过Map.unmodifiable创建Map对象:$testMap10,and type is ${testMap10.runtimeType}\n");


  //常用字段
  //需要注意的是:在调用这些字段的时候需要判断map是否为空,如果map为空则会抛出error,如:NoSuchMethodError: The getter 'length' was called on null.
  testMap8["哈哈哈"] = "呸呸呸";

  //获取map的长度:length字段
  print("\ntestMap8的长度:${testMap8.length}\n");

  //获取所有的key,返回一个Iterable
  print("\ntestMap8的key值${testMap8.keys}\n");

  //获取所有的value,返回一个Iterable
  print("\ntestMap8的value值:${testMap8.values}\n");

  //isEmpty:查看是否为空,map中没有元素的时候返回true,注意不是map == null
  print("\ntestMap8是否为空:${testMap8.isEmpty}\n");

  //isNotEmpty是否为非空,当map中至少有一个值的时候返回true,注意不是map == null,map != null 但是map中没有元素仍然返回false
  print("\ntestMap8是否为非空:${testMap8.isNotEmpty}\n");

  //将map输出为Iterable
  print("\ntestMap8的entries:${testMap8.entries}\n");

  //常用方法
  testMap8[1.235] = "1.2222";
  testMap8[4] = "4";
  //当map中包含指定的key时返回true
  //比较的时候需要注意数据类型
  print("\n$testMap8");
  bool containsKey1 = testMap8.containsKey("4");
  bool containsKey2 = testMap8.containsKey("one");
  bool containsKey3 = testMap8.containsKey(4);
  print("\ntestMap8的key中是否包含字符串4:$containsKey1");
  print("\ntestMap8的key中是否包含one:$containsKey2");
  print("\ntestMap8的key中是否包含数字4:$containsKey3");

  //当map中包含指定的value时返回true
  //比较的时候需要注意数据类型
  bool containsValue1 = testMap8.containsValue("4");
  bool containsValue2 = testMap8.containsValue(4);
  bool containsValue3 = testMap8.containsValue("哈哈");
  print("\ntestMap8的value中是否包含字符串4:$containsValue1");
  print("\ntestMap8的value中是否包含数字4:$containsValue2");
  print("\ntestMap8中是否包含字符串哈哈:$containsValue3");

  //通过Iterable<Map<K,V>>来添加数据
  List testList3 = List<MapEntry<String,int>>();
  testList3.add(MapEntry("咚咚咚", 22));
  testList3.add(MapEntry("哼哼哼", 100));
  Iterable testIterable3 = testList3.reversed;
  testMap8.addEntries(testIterable3);
  print("\n使用addEntries添加数据之后的map:$testMap8");

  //通过addAll(Map<K,V>)来添加数据
  print("$testMap2");
  testMap8.addAll(testMap2);
  print("通过addAll添加数据之后的map:$testMap8");

  //这个方法可以看作强制判断Map中的数据是否符合<RK,RV>中指定的数据类型,如果存在不符合<RK,RV>指定的数据类型,就会出现error
  Map<dynamic,dynamic> testCast = testMap8.cast();
  print("\ntestCast:$testCast");

  //取出当前map中的key和value在传入map中的函数中进行操作
  var testMapF = testMap8.map((key,value) => checkMap1(key, value));
  print("\n使用map对之前的Map进行操作,并返回一个新的Map:$testMapF,and testMapF is ${testMapF.runtimeType}");


  print("\n$testMap8");
  //删除符合条件的map中的元素
  testMap8.removeWhere((key,value) => key is int);//[4:4]这个元素被删除了
  print("删除testMap8中key是int类型的元素:$testMap8");

  //更新key中的信息,如果key不存在,会调用第三个参数中指定的函数,第三个参数为可选参数
  testMap8.update("one", (value) => "new"+ value.toString());
  print("\n更新一个map中存在的key的元素:$testMap8");
  //从源码中可以看出:如果在map中找到了指定的key,就会根据第二个参数指定的规则去修改key对应的value的数据
  //如果没有找到指定的key,就会去查看第三个参数是否设置
  //如果第三个参数没有设置,直接抛出error
  //如果设置了第三个参数,就会指定第三个参数,执行完之后会在当前map中添加元素:未找到的key:第三个参数返回的数据
  //如果第三个参部的函数没有返回值(void),那么依然会添加元素:未找到的key:null
  testMap8.update(4, (value) => "new" + value.toString(),ifAbsent: checkMap2);
  print("更新一个map中不存在的元素并且指定ifAbsent参数:$testMap8");

  //自定义更新操作
  testMap8.updateAll((key,value) => checkMap3(key, value));
  print("自定义更新操作之后testMap8中的值:$testMap8");

  //循环输出Map中的值
  print("\ntestMap8中的值:");
  testMap8.forEach((key,value) => print("$key : $value"));

  //添加数据
  print("\n添加数据之前:$testMap8");
  //添加一个已经存在的数据
  testMap8.putIfAbsent("three", () =>checkMap2());
  //添加一个不存在的数据
  testMap8.putIfAbsent("哒哒哒", () => checkMap2());
  print("添加数据之后$testMap8");//可以发现之前已经存在的key的数据并没有被改掉,之前没有的key会被添加进去并将第二个参数的函数的返回值作为value


  //清空map中的数据
  testMap8.clear();
  print("\ntestMap8中的数据被清空之后: $testMap8");
}

//定义一个函数
MapEntry checkMap1(dynamic key,dynamic value){
  print("传入的key:$key,传入的value$value");
  MapEntry entry;
  entry = MapEntry("new" + key.toString(), "new" + value.toString());
  return entry;
}

void checkMap2(){
  print("not found key");
  //return "not found key";
}

dynamic checkMap3(dynamic key,dynamic value){
  if(key is num){
    //如果当前数据类型是num value就设置为key + 1
    return key + 1;
  }
  //如果数据类型不是num,直接将原来的value返回,这里一定要return,如果没有return,会默认return null
  return value;
}

最终的控制台打印的数据如下:

这个demo用来演示Map中常用的属性和方法
testMap: {}
testMap3:{} and type is CastMap<int, String, int, String>
testMap4:{1: 哈哈哈} and type is _InternalLinkedHashMap<dynamic, dynamic>
testMap5:{1: 哈哈哈, 2: 嘻嘻嘻},and type is _InternalLinkedHashMap<dynamic, dynamic>

testMap6:{},and type is _CompactLinkedIdentityHashMap<dynamic, dynamic>


testMap7:{MapEntry(1: 哈哈哈)哈哈哈: MapEntry(1: 哈哈哈)嘻嘻嘻, MapEntry(2: 嘻嘻嘻)哈哈哈: MapEntry(2: 嘻嘻嘻)嘻嘻嘻},and type is _InternalLinkedHashMap<dynamic, dynamic>

testMap8:{one: 4, two: 2, three: 3}, and type is _InternalLinkedHashMap<dynamic, dynamic>


通过Map.of创建Map对象:{},and type is _InternalLinkedHashMap<dynamic, dynamic>


通过Map.unmodifiable创建Map对象:{1: 哈哈哈, 2: 嘻嘻嘻},and type is UnmodifiableMapView<dynamic, dynamic>
testMap8的长度:4


testMap8的key值(one, two, three, 哈哈哈)


testMap8的value值:(4, 2, 3, 呸呸呸)


testMap8是否为空:false

testMap8是否为非空:true


testMap8的entries:(MapEntry(one: 4), MapEntry(two: 2), MapEntry(three: 3), MapEntry(哈哈哈: 呸呸呸))


{one: 4, two: 2, three: 3, 哈哈哈: 呸呸呸, 1.235: 1.2222, 4: 4}

testMap8的key中是否包含字符串4:false

testMap8的key中是否包含one:true

testMap8的key中是否包含数字4:true

testMap8的value中是否包含字符串4:true

testMap8的value中是否包含数字4:true

testMap8中是否包含字符串哈哈:false

使用addEntries添加数据之后的map:{one: 4, two: 2, three: 3, 哈哈哈: 呸呸呸, 1.235: 1.2222, 4: 4, 哼哼哼: 100, 咚咚咚: 22}
{1: 哈哈哈}
通过addAll添加数据之后的map:{one: 4, two: 2, three: 3, 哈哈哈: 呸呸呸, 1.235: 1.2222, 4: 4, 哼哼哼: 100, 咚咚咚: 22, 1: 哈哈哈}

testCast:{one: 4, two: 2, three: 3, 哈哈哈: 呸呸呸, 1.235: 1.2222, 4: 4, 哼哼哼: 100, 咚咚咚: 22, 1: 哈哈哈}

传入的key:one,传入的value4
传入的key:two,传入的value2
传入的key:three,传入的value3
传入的key:哈哈哈,传入的value呸呸呸
传入的key:1.235,传入的value1.2222
传入的key:4,传入的value4
传入的key:哼哼哼,传入的value100
传入的key:咚咚咚,传入的value22
传入的key:1,传入的value哈哈哈

使用map对之前的Map进行操作,并返回一个新的Map:{newone: new4, newtwo: new2, newthree: new3, new哈哈哈: new呸呸呸, new1.235: new1.2222, new4: new4, new哼哼哼: new100, new咚咚咚: new22, new1: new哈哈哈},and testMapF is _InternalLinkedHashMap<dynamic, dynamic>

{one: 4, two: 2, three: 3, 哈哈哈: 呸呸呸, 1.235: 1.2222, 4: 4, 哼哼哼: 100, 咚咚咚: 22, 1: 哈哈哈}
删除testMap8中key是int类型的元素:{one: 4, two: 2, three: 3, 哈哈哈: 呸呸呸, 1.235: 1.2222, 哼哼哼: 100, 咚咚咚: 22}

更新一个map中存在的key的元素:{one: new4, two: 2, three: 3, 哈哈哈: 呸呸呸, 1.235: 1.2222, 哼哼哼: 100, 咚咚咚: 22}
not found key
更新一个map中不存在的元素并且指定ifAbsent参数:{one: new4, two: 2, three: 3, 哈哈哈: 呸呸呸, 1.235: 1.2222, 哼哼哼: 100, 咚咚咚: 22, 4: null}
自定义更新操作之后testMap8中的值:{one: null, two: null, three: null, 哈哈哈: null, 1.235: 2.2350000000000003, 哼哼哼: null, 咚咚咚: null, 4: 5}

添加数据之前:{one: new4, two: 2, three: 3, 哈哈哈: 呸呸呸, 1.235: 2.2350000000000003, 哼哼哼: 100, 咚咚咚: 22, 4: 5}
not found key
添加数据之后{one: new4, two: 2, three: 3, 哈哈哈: 呸呸呸, 1.235: 2.2350000000000003, 哼哼哼: 100, 咚咚咚: 22, 4: 5, 哒哒哒: not found key}

testMap8中的数据被清空之后: {}
Exited
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ffa_ijj/article/details/85062239

智能推荐

php getsheet,phpExcel中文帮助手册之常用功能指南_慕酒的博客-程序员宝宝

PHPExcel基本操作:定义EXCEL实体即定义一个PHPEXCEL对象,并设置EXCEL对象内显示内容// Excel开始// 准备EXCEL的包括文件// Error reportingerror_reporting(0);// PHPExcelrequire_once dirname(__FILE__) . 'PHPExcel.php';// 生成新的excel对象$objPHPExcel...

STM32L4调试记录_碑 一的博客-程序员宝宝

无法烧录:数据线与电源线不同。数据线也可以充电,但速度较慢,内部是四根线,电源线是两根。烧录无法保存:烧录后需重新上电。串口输出数据:一种是字节流,一种是串口打印,两个不同,后者便于调试。数据类型转换:char---u8,short---u16,int----u32,float----32,long----32。printf的重映射:添加stdio.h库,及如下代码即可://加...

能力不够,思维又太局限,在测试行业边缘犹豫徘徊,35岁之后真的会无路可走吗?_TEST_二 黑的博客-程序员宝宝

现在有很多正处于测试行业和在测试行业边缘一直犹豫徘徊的小伙伴都会有一个问题,那就是测试在35岁之后会不会无路可走。

WEB.config中appsetting和connectionstrings的区别与写法_薇薇吴的博客-程序员宝宝

  WEB.config中-----------01   -----------02        ////////////////////////////////////////////////////////////////public static SqlConnection ReturnConn()    {       // string strConn = Syst

史上最牛的脑筋急转弯_iteye_20755的博客-程序员宝宝

1、什么动物最没有方向感?答案:麋鹿(迷路)2、什么动物猜拳永远不会有输赢?答案:螃蟹3、什么动物最容易摔倒?答案:狡猾的狐狸(脚滑)4、什么鸡没有翅膀?答案:田鸡5、如果动物园失火了,最先逃出来的是哪一种动物?答案:人 6、农夫养10头牛,只有19只角,为什么?答案:有一只犀牛7、什么动物能贴在墙上?答案:海豹(海报) 8、让九匹马平均分配到十个马圈里,并且每个圈...

随便推点

【Linux】【Services】【VersionControl】git-daemon, httpd, mysql搭建带认证的gitserver_weixin_30325971的博客-程序员宝宝

1. 简介:比较低端的gitserver,使用centos自带的git-daemon搭建gitserver,使用httpd做上传和下载,利用mod_auth_mysql做认证2. 环境# Apache的运行环境apr-util-mysql.x86_64 1.5.2-6.el7 ...

01 Cesium—环境搭建_WorkLee的博客-程序员宝宝_cesium环境搭建

文章中所有操作均是在 Cesium 1.91 版本下进行的,其它版本差异请自行适配验证浏览器Cesium 需要浏览器支持 WebGL,可以通过访问CesiumJS 官网,能看到正常显示基本上就能测试自己的浏览器是否支持 Cesium,这里强烈推荐使用 Chrome 浏览器。选择IDE官网中写到:If you’re already a seasoned developer, you most likely have a favorite editor or development enviro..

Kubernetes入门(一)_最爱喝酸奶的博客-程序员宝宝_kubernetes入门

Kubernetes也叫做k8s。它是一个开源系统,主要用于自动部署、扩容缩容和管理容器化应用。它将诸多应用的容器分为若干个逻辑单元以便于管理和发现。kubernetes拥有着Google高负载生产环境的15年经验,并结合了社区的优秀思想和实践。30.1 Kubernetes介绍Kubernetes官网:https://kubernetes.io/在Kubernetes中,service...

Google Colab 基本操作_clemente620的博客-程序员宝宝

## 上传from google.colab import filesuploaded = files.upload()for fn in uploaded.keys(): print('User uploaded file "{name}" with length {length} bytes'.format( name=fn, length...

Julia: PkgMirrors,提升库下载速度_songroom的博客-程序员宝宝

从脚 本using PkgPkg.add("PkgMirrors")using PkgMirrorsPkgMirrors.setmirror("ZJU") #浙江大学 #PkgMirrors.setmirror("USTC")从repl(v1.3) pkg&gt; add PkgMirrorsjulia&gt; import PkgMirrorsjulia&gt; PkgMir...

CodeFun进阶指南 | 在线预览_CodeFunTeam的博客-程序员宝宝_在线预览

本期内容,想在这里给大家分享 CodeFun 上线的功能:在线预览,预览的作用是能够看到设计稿转化成代码之后的运行效果,用户根据这个效果进行后续的优化和调整。接下来,我们就一起来看看吧!在工具中预览从 Sketch 导入到项目之后,进入某个页面的详情页中便可与进行预览。除了预览之外,这个界面功能十分丰富,在这个界面中你可以可看到页面的层级、元素的样式等信息,也可以设置页面的交互操作,只要和页面的设置相关的功能都会在这个界面中。微信小程序假如生成的是微信小程序代码,这个章节介绍如何对其进行预

推荐文章

热门文章

相关标签