何気ないDartのMapを全然知らなかった...。そんな使い方あるんや。。。
Mapって何が出来るんや!?とか思うシーンがあったから
ちょっとだけ漁ってみたら、、、意外も意外。
Mapのことを全く知らなかった事について知った。
という事で、興味のある箇所だけ調べたのでシェアします。
Q1. 下記のログには何が出るでしょうか?
var map = {
'key': 'value',
'key': 'value',
'key': 'value',
};
print(map);
答えは、、、、、、
{key: test}
はい、まさかの3つ出ないんかいって感じですよね。
僕はこれ3つ出ると思ってました。
なので、毎回同じのを格納してはいけないと思いながら
addAllとかupdateを使い分けていました。
という事でこの辺も問題出します。
Q2. 下記のログには何が出るでしょうか?
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 doingthis[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が存在しない場合は追加するよ〜っていうやつ。
var map = {};
map.update('data', (value) => 'test', ifAbsent: () => 'test')
ゲロゲロゲロ。
updateもaddもお互い両方いらんやんw
なんこれ。どうなってるんw
両方ともが優秀ってパティーンなんかなぁw
誰か教えてちょ。
Discussion