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}
最佳实践
- 不可变键: 建议为 Map 键使用不可变对象。
- 空安全: 如果值可能为 null,请使用可空类型。
- 高效查找: 使用 containsKey 进行键存在性检查。
- 正确哈希: 使用自定义键时重写 hashCode。
来源
本教程通过实际示例介绍了 Dart 的 Map 接口,演示了其核心功能和常见用法模式。
作者
列出 所有 Dart 教程。