🔥

何気ないDartのMapを全然知らなかった...。そんな使い方あるんや。。。

2023/01/23に公開

Mapって何が出来るんや!?とか思うシーンがあったから
ちょっとだけ漁ってみたら、、、意外も意外。

Mapのことを全く知らなかった事について知った。

という事で、興味のある箇所だけ調べたのでシェアします。

Q1. 下記のログには何が出るでしょうか?

問題1
var map = {
  'key': 'value',
  'key': 'value',
  'key': 'value',
};
print(map);

答えは、、、、、、

アンサー
{key: test}

はい、まさかの3つ出ないんかいって感じですよね。
僕はこれ3つ出ると思ってました。

なので、毎回同じのを格納してはいけないと思いながら
addAllとかupdateを使い分けていました。

という事でこの辺も問題出します。

Q2. 下記のログには何が出るでしょうか?

問題2
var map = {
  'key': 'value',
};

map.addAll({'key': 'valueTest'});
print(map);

答えは、、、

アンサー
{'key': 'valueTest'}

という事でした。

これ見て気付いて欲しい事としては、
え、勝手に変換されるならupdateとか要らんやんって話です。

で、実際にメソッドの軽い説明文を読むとそんな感じの事が
微妙に感じ取られる気がします。
(本当にこの使い方して良いかは知らん)

/// Adds all key/value pairs of [other] to this map.
///
/// If a key of [other] is already in this map, its value is overwritten.
///
/// The operation is equivalent to doing this[key] = value for each key
/// and associated value in other. It iterates over [other], which must
/// therefore not change during the iteration.
/// dart /// final planets = <int, String>{1: 'Mercury', 2: 'Earth'}; /// planets.addAll({5: 'Jupiter', 6: 'Saturn'}); /// print(planets); // {1: Mercury, 2: Earth, 5: Jupiter, 6: Saturn} ///

翻訳:/// [other] のすべてのキーと値のペアをこのマップに追加します。
///
/// [other] のキーが既にこのマップにある場合、その値は上書きされます。
///
この操作は、各キーと関連付けられた値に対して「this[key] = value」を実行するのと同じです。 [other] を反復するため、反復中に変更してはなりません。
/// ダーツ /// 最終的な惑星 = <int, String>{1: '水星', 2: '地球'}; /// Planets.addAll({5: '木星', 6: '土星'}); /// print(惑星); // {1: 水星、2: 地球、5: 木星、6: 土星} ///

わからんけど、どうやら上書きされるらしいね。
知らなんだ。

今まではこんな感じにしてたけど、もう要らんやん。笑

今までのコード
var map = {};
map['data'] == null
  ? map.addAll({'data': 'test'})
  : map.update('data', (value) => 'test')

このわざわざデータがあるかどうかのチェックも要らないし
それに沿ったupdateも全く要らないという...。何ともまぁ不思議w

まぁ、ついでにupdateを調べてみると
何気にこの関数にはもう一つの引数があったのだ。
それが、ifAbsentというやつ。

これは、もし指定のmapデータに指定のkeyが存在しない場合は追加するよ〜っていうやつ。

update ifAbsentの使い方
var map = {};
map.update('data', (value) => 'test', ifAbsent: () => 'test')

ゲロゲロゲロ。

updateもaddもお互い両方いらんやんw
なんこれ。どうなってるんw
両方ともが優秀ってパティーンなんかなぁw

誰か教えてちょ。

Discussion

ログインするとコメントできます