Flutter

Dart常用数据类型之Map

2019-04-28  本文已影响24人  chilim

key-value键值对(可以使用相关联的key检索value值)的集合, 即传说中的字典
Map中key的数量是有限的,每个key正好有一个相关的value
Map、以及它的键和值,都是可以迭代的, 迭代的顺序由Map不同的类型定义
HashMap是无序的,这意味着它迭代的顺序是不确定的
LinkedHashMapkey的插入顺序进行迭代
SplayTreeMapkey的排序顺序进行迭代
当Map的一个操作正在执行的时候,通常不允许修改Map(添加或删除key)

创建Map

Map()
// 创建一个Map实例,默认实现是LinkedHashMap。
 
Map.from(Map other)
// 创建一个LinkedHashMap实例,包含other的所有键值对。
 
Map.fromIterable(Iterable iterable, {K key(element), V value(element)})
// 创建一个Map实例,其中Key和Value由iterable的元素计算得到。
 
Map.fromIterables(Iterable<K> keys, Iterable<V> values)
// 将指定的keys和values关联,创建一个Map实例。
 
Map.identity()
// 使用默认实现LinkedHashMap创建一个严格的Map。
 
Map.unmodifiable(Map other)
// 创建一个不可修改、基于哈希值的Map,包含other所有的项

具体使用

// 创建一个Map实例, 插入顺序进行排列
  var dic = new Map();
  print(dic);  // {}
 
  // 根据一个Map创建一个新的Map, 插入顺序进行排列
  var dic1 = new Map.from({'name': 'titan'});
  print(dic1);  // {name: titan}
 
  // 根据List创建Map, 插入顺序进行排列
  List<int> list = [1, 2, 3];
  // 使用默认方式, key和value都是数组对应的元素
  var dic2 = new Map.fromIterable(list);
  print(dic2);  // {1: 1, 2: 2, 3: 3}
  // 设置key和value的值
  var dic3 = new Map.fromIterable(list, key: (item) => item.toString(), value: (item) => item * item);
  print(dic3);  // {1: 1, 2: 4, 3: 9}
 
  // 两个数组映射一个字典, 插入顺序进行排列
  List<String> keys = ['name', 'age'];
  var values = ['jun', 20];
  // 如果有相同的key值, 后面的值会覆盖前面的值
  var dic4 = new Map.fromIterables(keys, values);
  print(dic4);  // {name: jun, age: 20}
 
  // 创建一个空的Map, Map允许null作为key
  var dic5 = new Map.identity();
  print(dic5);  //{}
 
  // 创建一个不可修改、基于哈希值的Map
  var dic6 = new Map.unmodifiable({'name': 'titan'});
  print(dic6);

 var map1 = {'name': 'titan', 'age': 20};
  // 哈希值
  print(map1.hashCode); 
 
  // 运行时类型
  print(map1.runtimeType);  //_InternalLinkedHashMap<String, Object>
 
  // 是否为空, null不能判断, 会报错
  print(map1.isEmpty);  // false
 
  // 是否不为空
  print(map1.isNotEmpty);  // true
 
  // 键值对个数
  print(map1.length);   // 2
 
  // 所有的key值, 返回Iterable<K>类型
  print(map1.keys.toList());  // [name, age]
 
  // 所有的value值, 返回Iterable<K>类型
  print(map1.values.toList());   // [titan, 20]
 
  // 根据key取值
  print(map1['name'] ?? '');   // titan
 
  // 根据key赋值
  map1['age'] = 30;
  print(map1); 

函数

 var map2 = {'name': 'titan', 'age': 20};
 
  // 添加一个map
  map2.addAll({'blog': 'titanjun'});
  print(map2);
  // {name: titan, age: 20, blog: titanjun}
 
  // 判断是否包含指定的key
  print(map2.containsKey('age'));  //
 
  // 判断是否包含指定的value
  print(map2.containsValue('titan'));
 
  // 操作每个键值对
  map2.forEach((key, value) {
    print('key = $key, value = $value');
  });
 
  // 查找key对应的value,或添加一个新的值为key.length的value
  for (var key in ['name', 'age', 'king']) {
    // 函数的返回值为查找到的对应的value值
    print(map2.putIfAbsent(key, () => key.length));
  }
  print(map2);
  // {name: titan, age: 20, blog: titanjun, king: 4}
 
  // 转成字符串
  print(map2.toString());
 
  // 删除键值对, 返回删除key对应的value值, 没有则返回null
  print(map2.remove('blog'));  //titanjun
  print(map2.remove('coder'));  //null
  print(map2);
 
  // 删除所有的键值对
  map2.clear();
  print(map2);  //{}
上一篇下一篇

猜你喜欢

热点阅读