Dart:如何使用 Map.map() 方法/函数

cho*_*man 5 dart

我正在尝试在 Dart 中的对象上使用“map”方法/函数Map。(我知道,这很拗口,而且很难在谷歌中搜索)。

https://api.flutter.dev/flutter/dart-core/Map/map.html

它本质上就像List.map通过对键和值对应用转换来生成新的 Map。

为什么你可以使用这个?也许您需要重命名Map对象中的某些键。

示例代码/错误

void main() {
  Map myMap={"a":1, "b":2};
  print(myMap);
  
  print(myMap.map((k,v) {
    k=k+k;
    v=v*10;
    return {k:v};

  // I expect { aa:10,bb:20 }
  }));
}
Run Code Online (Sandbox Code Playgroud)

我收到编译错误:

Error: A value of type 'Map<dynamic, dynamic>' can't be returned from a function with return type 'MapEntry<dynamic, dynamic>'.
 - 'Map' is from 'dart:core'.
 - 'MapEntry' is from 'dart:core'.
    return {k:v};
           ^
Error: Compilation failed.
Run Code Online (Sandbox Code Playgroud)

由于我在网上没有找到任何例子,所以我在这里写下答案。

cho*_*man 3

在上面的代码中,我期望它在 return 语句中获取单独的 Map 项并将它们合并到一个 Map 对象中。但是,它却给出了一个错误。它想要一个MapEntry对象。

所以正确的代码是

void main() {
  Map myMap={"a":1, "b":2};
  print(myMap);
  
  print(myMap.map((k,v) {
    k=k+k;
    v=v*10;
    return MapEntry(k, v);
  }));
  
  print(myMap);
}
Run Code Online (Sandbox Code Playgroud)

此外,控制台输出是

{a: 1, b: 2}
{aa: 10, bb: 20}
{a: 1, b: 2}
Run Code Online (Sandbox Code Playgroud)

关于变量传递的附录

注意:我担心(并想知道)修改转换函数中的kv变量是否会修改原始对象中的任何内容。所以,我查了一下。当键和值是不可变对象(如字符串和数字)时,不会发生任何变化。

相反,如果您有一个可变对象(例如地图),那么它确实会更改该对象。

例如,参见:

void main() {
  Map myMap={"a":1, "b":2};
  print(myMap);
  
  print(myMap.map((k,v) {
    k=k+k;
    v=v*10;
    return MapEntry(k, v);
  }));
  
  print(myMap);
  
  print("======");
  
  Map myMap2={"c":1, "d":{"changed": "no"}};
  print(myMap2);
  
  print(myMap2.map((k,v) {
    k=k+k+k;
    if (k=="ddd") {
      v["changed"]="yes";
    }
    return MapEntry(k, v);
  }));
  
  print(myMap2);
}
Run Code Online (Sandbox Code Playgroud)

哪个返回

{a: 1, b: 2}
{aa: 10, bb: 20}
{a: 1, b: 2}
======
{c: 1, d: {changed: no}}
{ccc: 1, ddd: {changed: yes}}
{c: 1, d: {changed: yes}}
Run Code Online (Sandbox Code Playgroud)

请参阅https://dartpad.dev/?id=57382792d2fa7a50566c228678a1d4da&null_safety=true