Flutter Map 常用的函数与使用场景

1. Map.entries

  • 功能: 返回 Map 的所有键值对,以 Iterable<MapEntry<K, V>> 形式表示。
  • 使用场景: 当需要遍历 Map 的所有键值对时,可以使用 entries 来访问每个 MapEntry 对象,方便提取键和值。
示例:
Map<String, String> fruits = {
    
    'a': 'Apple', 'b': 'Banana'};

fruits.entries.forEach((entry) {
    
    
  print('Key: ${
      
      entry.key}, Value: ${
      
      entry.value}');
});

输出:

Key: a, Value: Apple
Key: b, Value: Banana

2. Map.from

  • 功能: 创建一个新的 Map,并将现有的 Map 内容复制过来。
  • 使用场景: 当需要复制一个现有的 Map 并进行修改时,可以使用 Map.from
示例:
Map<String, int> original = {
    
    'apple': 1, 'banana': 2};
Map<String, int> copy = Map.from(original);
copy['orange'] = 3; // 修改复制后的 Map

print(original); // 输出: {apple: 1, banana: 2}
print(copy);     // 输出: {apple: 1, banana: 2, orange: 3}

3. Map.addAll

  • 功能: 将另一个 Map 的键值对添加到当前 Map
  • 使用场景: 如果有两个 Map,并且希望将一个 Map 的内容添加到另一个 Map 中,可以使用 addAll
示例:
Map<String, int> map1 = {
    
    'a': 1, 'b': 2};
Map<String, int> map2 = {
    
    'c': 3, 'd': 4};

map1.addAll(map2);
print(map1); // 输出: {a: 1, b: 2, c: 3, d: 4}

4. Map.containsKeyMap.containsValue

  • 功能: 判断 Map 是否包含指定的键或值。
  • 使用场景: 当需要检查一个 Map 是否包含某个键或某个值时,可以使用这两个方法。
示例:
Map<String, int> map = {
    
    'apple': 1, 'banana': 2};

print(map.containsKey('apple'));  // 输出: true
print(map.containsValue(3));      // 输出: false

5. Map.remove

  • 功能: 移除 Map 中指定键的键值对。
  • 使用场景: 当需要从 Map 中移除某个键值对时,使用 remove
示例:
Map<String, int> map = {
    
    'apple': 1, 'banana': 2};

map.remove('apple');
print(map); // 输出: {banana: 2}

6. Map.update

  • 功能: 更新 Map 中指定键的值。如果该键不存在,可以插入一个新的键值对。
  • 使用场景: 如果需要根据某个键更新值,或者如果键不存在则插入新的键值对,可以使用 update
示例:
Map<String, int> map = {
    
    'apple': 1, 'banana': 2};

map.update('apple', (value) => value + 1, ifAbsent: () => 3);
print(map); // 输出: {apple: 2, banana: 2}

7. Map.addEntries

  • 功能: 将 MapEntry 的集合添加到 Map 中。
  • 使用场景: 当需要添加多个键值对时,可以通过 MapEntry 批量添加。
示例:
Map<String, int> map = {
    
    'apple': 1, 'banana': 2};

map.addEntries([
  MapEntry('orange', 3),
  MapEntry('grape', 4),
]);
print(map); // 输出: {apple: 1, banana: 2, orange: 3, grape: 4}

8. Map.updateAll

  • 功能: 更新 Map 中所有元素的值。
  • 使用场景: 当需要对 Map 中的每个值进行某种操作时,可以使用 updateAll
示例:
Map<String, int> map = {
    
    'apple': 1, 'banana': 2};

map.updateAll((key, value) => value * 2);
print(map); // 输出: {apple: 2, banana: 4}

9. Map.forEach

  • 功能: 遍历 Map 中的所有键值对。
  • 使用场景: 当需要遍历整个 Map 并执行某些操作时,使用 forEach 方法。
示例:
Map<String, int> map = {
    
    'apple': 1, 'banana': 2};

map.forEach((key, value) {
    
    
  print('Key: $key, Value: $value');
});

输出:

Key: apple, Value: 1
Key: banana, Value: 2

10. Map.putIfAbsent

  • 功能: 如果 Map 中不存在指定的键,则插入指定的键值对。
  • 使用场景: 如果不确定某个键是否已经存在于 Map 中,并希望在不存在的情况下插入一个默认值,可以使用 putIfAbsent
示例:
Map<String, int> map = {
    
    'apple': 1};

map.putIfAbsent('banana', () => 2);
map.putIfAbsent('apple', () => 3); // 不会替换已有的值

print(map); // 输出: {apple: 1, banana: 2}

11. Map.asMap()

  • 功能: 将 List 转换为 Map,其中键为列表元素的索引,值为列表中的元素。
  • 使用场景: 当需要将 List 转换为 Map 时,可以使用 asMap(),它会将每个列表元素的索引作为键。
示例:
List<String> list = ['apple', 'banana', 'cherry'];

Map<int, String> map = list.asMap();
map.forEach((index, value) {
    
    
  print('Index: $index, Value: $value');
});

输出:

Index: 0, Value: apple
Index: 1, Value: banana
Index: 2, Value: cherry

12. Map.fromIterable

  • 功能: 通过一个可迭代对象(如 ListSet)创建一个 Map,可以指定键和值。
  • 使用场景: 如果有一个 Iterable 对象并想根据一定的规则构建一个 Map,可以使用 fromIterable
示例:
List<String> list = ['apple', 'banana', 'cherry'];

Map<int, String> map = Map.fromIterable(
  list,
  key: (item) => list.indexOf(item),  // 使用索引作为键
  value: (item) => item,  // 使用元素作为值
);

print(map); // 输出: {0: apple, 1: banana, 2: cherry}

总结:

  • entries: 用于遍历 Map 的键值对,适用于直接操作 MapEntry
  • asMap() : 用于将 List 转换为 Map,适用于需要根据索引访问列表的情况。
  • addAll: 用于将另一个 Map 的内容添加到当前 Map
  • containsKeycontainsValue: 用于判断 Map 是否包含指定的键或值。
  • remove: 用于移除指定键的键值对。
  • update: 用于更新指定键的值。
  • addEntries: 用于批量添加多个键值对。
  • updateAll: 用于更新 Map 中所有值。
  • forEach: 用于遍历整个 Map
  • putIfAbsent: 用于插入一个不存在的键值对。
  • fromIterable: 用于从 Iterable 创建一个 Map

这些方法和属性提供了多种灵活的方式来操作 Map 类型的数据。选择使用哪个方法,取决于要完成的具体任务。