美文网首页Flutter
Dart常用数据类型之Map

Dart常用数据类型之Map

作者: chilim | 来源:发表于2019-04-28 21:38 被阅读24次

    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);  //{}
    

    相关文章

      网友评论

        本文标题:Dart常用数据类型之Map

        本文链接:https://www.haomeiwen.com/subject/bdlsnqtx.html