ZetCode

Dart Map 接口

最后修改于 2025 年 4 月 4 日

在 Dart 中,Map 是键值对的集合,其中每个键都是唯一的。它提供了高效的查找、插入和删除操作。

Map 接口由 HashMap 和 LinkedHashMap 等类实现。键必须具有一致的 Object.== 和 Object.hashCode 实现才能正常工作。

创建 Map

创建 Map 最简单的方法是使用花括号的字面量语法。

main.dart
void main() {
  var capitals = {
    'USA': 'Washington',
    'Japan': 'Tokyo',
    'France': 'Paris'
  };

  print(capitals);
  print(capitals['Japan']); // Access by key
}

我们使用字面量语法创建一个国家-首都对的 Map。类型被推断为 Map<String, String>。我们使用 [] 运算符访问值。

$ dart main.dart
{USA: Washington, Japan: Tokyo, France: Paris}
Tokyo

Map 操作

基本的 Map 操作包括添加、更新和删除键值对。

main.dart
void main() {
  var scores = {'Alice': 90, 'Bob': 85};
  
  // Add new entry
  scores['Charlie'] = 95;
  
  // Update existing entry
  scores['Alice'] = 92;
  
  // Remove entry
  scores.remove('Bob');
  
  print(scores);
  print('Length: ${scores.length}');
}

我们演示了基本的 Map 操作。length 属性返回键值对的数量。remove 方法通过键删除条目。

$ dart main.dart
{Alice: 92, Charlie: 95}
Length: 2

Map 实用方法

Map 提供了一些实用的方法,用于常见操作,例如 containsKey。

main.dart
void main() {
  var inventory = {
    'apples': 10,
    'oranges': 5,
    'bananas': 20
  };

  print(inventory.containsKey('apples')); // true
  print(inventory.containsValue(15));    // false
  
  inventory.update('apples', (value) => value + 5);
  inventory.putIfAbsent('pears', () => 8);
  
  print(inventory);
}

containsKey 检查键是否存在,而 containsValue 检查值是否存在。update 修改现有值,putIfAbsent 安全地添加新条目。

$ dart main.dart
true
false
{apples: 15, oranges: 5, bananas: 20, pears: 8}

迭代 Map

有几种方法可以迭代 Map 的条目、键和值。

main.dart
void main() {
  var colors = {
    'red': '#FF0000',
    'green': '#00FF00',
    'blue': '#0000FF'
  };

  // Iterate keys
  print('Keys:');
  for (var key in colors.keys) {
    print(key);
  }

  // Iterate values
  print('\nValues:');
  colors.values.forEach(print);

  // Iterate entries
  print('\nEntries:');
  colors.forEach((key, value) => print('$key: $value'));
}

我们演示了三种迭代方法。keys 和 values 属性返回可迭代对象。forEach 方法在回调中同时提供键和值。

$ dart main.dart
Keys:
red
green
blue

Values:
#FF0000
#00FF00
#0000FF

Entries:
red: #FF0000
green: #00FF00
blue: #0000FF

Map 转换

可以使用 map、where 和 addAll 等方法转换 Map。

main.dart
void main() {
  var original = {'a': 1, 'b': 2, 'c': 3};
  
  // Transform values
  var squared = original.map((key, value) => 
      MapEntry(key, value * value));
  
  // Filter entries
  var filtered = Map.fromEntries(original.entries
      .where((entry) => entry.value > 1));
  
  // Merge maps
  var merged = {...original, 'd': 4, 'e': 5};
  
  print('Squared: $squared');
  print('Filtered: $filtered');
  print('Merged: $merged');
}

map 方法通过转换每个条目来创建一个新的 Map。我们使用 where 进行过滤,并使用展开运算符 (...) 进行合并。这些操作返回新的 Map。

$ dart main.dart
Squared: {a: 1, b: 4, c: 9}
Filtered: {b: 2, c: 3}
Merged: {a: 1, b: 2, c: 3, d: 4, e: 5}

最佳实践

来源

Dart Map 文档

本教程通过实际示例介绍了 Dart 的 Map 接口,演示了其核心功能和常见用法模式。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Dart 教程