【Dart 專題】Map 集合小結(jié)~

????Map 在日常生活中最常見的集合方式最欠,而 Dart 中的 Map 相較于 Android 中的 Map 略有不同,使用會(huì)更加靈活惩猫;小菜今天盡可能系統(tǒng)的學(xué)習(xí)一下芝硬;

Map

????Map 是一個(gè) key-value 鍵值對(duì)的集合對(duì)象,其 keyvalue 是一對(duì)多的關(guān)系轧房;類似于 AndroidMap拌阴,Dart Map 也分為 HashMap 無序的 Map 集合、LinkedHashMap 插入有序的 Map 集合以及 SplayTreeMap 已排序好的 Map 集合锯厢;主要在 dart.core 核心庫中皮官;

????MapList 都屬于泛型類,其中 key-value 均不指定具體類型实辑,默認(rèn)為 dynamic捺氢;

構(gòu)造函數(shù)

????Map 提供了眾多的構(gòu)造函數(shù),小菜逐一嘗試一下剪撬;

1. Map()

????Map() 默認(rèn)構(gòu)造函數(shù)會(huì)實(shí)現(xiàn)一個(gè) LinkedHashMap 對(duì)象摄乒,相同的 key 后面的會(huì)覆蓋之前的 value

Map map = {'name': 'ACE', 'age': 18, 'isChecked': false};

Map map01 = Map();
map01['name'] = 'ACE';
map01['age'] = 18;
map01['isChecked'] = false;
map01['isChecked'] = true;

print('Map -> $map -> $map01');

I/flutter ( 8933): Map -> {name: ACE, age: 18, isChecked: false} -> {name: ACE, age: 18, isChecked: true}

2. Map.of()

????Map.of() 創(chuàng)建一個(gè)與其他 Map 對(duì)應(yīng) key-valueLinkedHashMap 對(duì)象残黑;

Map map = {'name': 'ACE', 'age': 18, 'isChecked': false};

Map map02 = Map.of(map);
map02['isChecked'] = true;

print('Map -> $map -> $map02');

I/flutter ( 8933): Map -> {name: ACE, age: 18, isChecked: false} -> {name: ACE, age: 18, isChecked: true}

3. Map.from()

????Map.from() 創(chuàng)建一個(gè)與其他 Map 對(duì)應(yīng) key-valueLinkedHashMap 對(duì)象馍佑;同時(shí) key-value 數(shù)據(jù)類型可以是其他 Map 對(duì)應(yīng)的數(shù)據(jù)類型及子類;

Map map = {'name': 'ACE', 'age': 18, 'isChecked': false};

Map map03 = Map.from(map);
map03['isChecked'] = true;

print('Map -> $map -> $map03');

I/flutter ( 8933): Map -> {name: ACE, age: 18, isChecked: false} -> {name: ACE, age: 18, isChecked: true}

4. Map.unmodifiable()

????Map.unmodifiable() 創(chuàng)建一個(gè)不可修改的與其他 Map 對(duì)應(yīng) key-valueLinkedHashMap 對(duì)象梨水;

Map map = {'name': 'ACE', 'age': 18, 'isChecked': false};

Map map04 = Map.unmodifiable(map);
// 異常 Unsupported operation: Cannot modify unmodifiable map
// map04['isChecked'] = true;

print('Map -> $map -> $map04');

I/flutter (21830): Map -> {name: ACE, age: 18, isChecked: false} -> {name: ACE, age: 18, isChecked: false}

5. Map.fromIterable()

????Map.fromIterable() 創(chuàng)建一個(gè)從 Iterable 中獲取對(duì)應(yīng) key-valueLinkedHashMap 對(duì)象拭荤;

List list = ['ACE', 18, false];
Map map05 = Map.fromIterable(list);
Map map06 = Map.fromIterable(list, key: (item) => item.toString(), value: (item) => item.toString());

print('Map -> $map05 -> $map06');

I/flutter ( 8933): Map -> {ACE: ACE, 18: 18, false: false} -> {ACE: ACE, 18: 18, false: false}

6. Map.fromIterables()

????Map.fromIterables() 創(chuàng)建一個(gè)給定 keyvalueLinkedHashMap 對(duì)象;

List keyList = ['name', 'age', 'isChecked'];
List valueList = ['ACE', 18, false];
Map map07 = Map.fromIterables(keyList, valueList);

print('Map -> $map07');
        
I/flutter (21830): Map -> {name: ACE, age: 18, isChecked: false}

7. Map.fromEntries()

????Map.fromEntries() 創(chuàng)建一個(gè)新的 Map疫诽,可以配合 List 等進(jìn)行排序舅世;

Map map = {'name': 'ACE', 'age': 18, 'isChecked': false};
Map map08 = Map.fromEntries(map.entries.toList());

print('Map -> $map -> $map08');

List list = ['aaa', 'ddd', 'mmm', 'bbb'];
Map map05 = Map.fromIterable(list);
Map map09 = Map.fromEntries(map05.entries.toList()..sort((e1, e2) => e1.value.compareTo(e2.value)));

print('Map -> $map05 -> $map09');

I/flutter (21830): Map -> {name: ACE, age: 18, isChecked: false} -> {name: ACE, age: 18, isChecked: false}
I/flutter (21830): Map -> {aaa: aaa, ddd: ddd, mmm: mmm, bbb: bbb} -> {aaa: aaa, bbb: bbb, ddd: ddd, mmm: mmm}

8. Map.castFrom()

????Map.castFrom() 創(chuàng)建一個(gè)類型與其他 Map key-value 類型一致的 Map旦委;

Map<String, dynamic> map = {'name': 'ACE', 'age': 18, 'isChecked': false};
Map map10 = Map.castFrom(map);
Map map11 = Map.castFrom<String, dynamic, String, dynamic>(map);

print('Map -> $map -> $map10 -> $map11');

// 異常,類型不匹配
Map map12 = Map.castFrom<String, dynamic, String, String>(map);
print('Map -> $map -> $map10 -> $map12');

I/flutter (21830): Map -> {name: ACE, age: 18, isChecked: false} -> {name: ACE, age: 18, isChecked: false} -> {name: ACE, age: 18, isChecked: false}

非構(gòu)造函數(shù)方法

1. containsKey & containsValue

????containsKey & containsValue 判斷 Map 中是否有對(duì)應(yīng)相同的 key & value雏亚,返回 bool 類型缨硝;

Map map = {'name': 'ACE', 'age': 18, 'isChecked': false};

print('Map -> ${map.containsKey('name')} -> ${map.containsValue('ACE')} -> ${map.containsKey('address')} -> ${map.containsKey('Hello!')}');
        
I/flutter (21830): Map -> true -> true -> false -> false

2. addEntries & addAll

????addEntries & addAll 用于合并兩個(gè)同類型的 Map,若有相同 key 后面的 Map 會(huì)替換之前 Map 對(duì)應(yīng)的 key-value罢低;不同之處在于 addAll 是添加整個(gè) MapaddEntries 是通過 Iterable 添加查辩;

Map map = {'name': 'ACE', 'age': 18, 'isChecked': false};
Map map01 = {'name': '和尚', 'address': '北京'};

print('Map -> $map -> $map01');

map.addEntries(map01.entries);
// map.addAll(map01);
print('Map -> $map -> $map01');

I/flutter (21830): Map -> {name: ACE, age: 18, isChecked: false} -> {name: 和尚, address: 北京}
I/flutter (21830): Map -> {name: 和尚, age: 18, isChecked: false, address: 北京} -> {name: 和尚, address: 北京}

3. forEach

????forEach 用于遍歷 Map 集合中各 key-value 在遍歷過程中不允許增加和刪除鍵值對(duì);

Map map = {'name': 'ACE', 'age': 18, 'isChecked': false};

print('Map -> $map');

map.forEach((key, value) {
  if (key == 'name') value = '和尚';
  print('Map -> $key -> $value');
});

I/flutter (21830): Map -> {name: ACE, age: 18, isChecked: false}
I/flutter (21830): Map -> name -> 和尚
I/flutter (21830): Map -> age -> 18
I/flutter (21830): Map -> isChecked -> false

4. putIfAbsent

????putIfAbsentMap 中含有對(duì)應(yīng)的 key-value 則返回 key网持,否則將新的 key-value 添加到 Map 中宜岛;

Map map = {'name': 'ACE', 'age': 18, 'isChecked': false};
print('Map -> $map');

map.putIfAbsent('name', () => '和尚');
print('Map -> $map -> ${map.putIfAbsent('name', () => '和尚')}');

map.putIfAbsent('address', () => '北京');
print('Map -> $map');

I/flutter (21830): Map -> {name: ACE, age: 18, isChecked: false}
I/flutter (21830): Map -> {name: ACE, age: 18, isChecked: false} -> ACE
I/flutter (21830): Map -> {name: ACE, age: 18, isChecked: false, address: 北京}

5. update & updateAll

????update & updateAll 用于更新 Mapkey-value

Map map = {'name': 'ACE', 'age': 18, 'isChecked': false};
print('Map -> $map');

map.update('name', (value) => '和尚');
print('Map -> $map');

map.update('address', (value) => 'Hello!', ifAbsent: () => '北京');
print('Map -> $map');

map.updateAll((key, value) {
  if (key == 'name') return '和尚';
  if (key == 'age') return value * 2;
  if (key == 'isChecked') return !value;
});
print('Map -> $map');

I/flutter (21830): Map -> {name: ACE, age: 18, isChecked: false}
I/flutter (21830): Map -> {name: 和尚, age: 18, isChecked: false}
I/flutter (21830): Map -> {name: 和尚, age: 18, isChecked: false, address: 北京}
I/flutter (21830): Map -> {name: 和尚, age: 36, isChecked: true, address: null}

6. remove & removeWhere & clear

????remove 用于刪除 Map 中單個(gè) key-value翎碑,若不存在對(duì)應(yīng)的 key-value 則無任何操作谬返;removeWhere 用于通過條件進(jìn)行批量刪除,小菜嘗試把 Map value 不是 String 類型的刪除日杈;clear 是通用的清空 Map 集合遣铝;

Map map = {'name': 'ACE', 'age': 18, 'isChecked': false};
print('Map -> $map');

map.remove('age');
print('Map -> $map');

map.remove('address');
print('Map -> $map');

map.removeWhere((key, value) {
  return value.runtimeType != String;
});
print('Map -> $map');

map.clear();
print('Map -> $map');

I/flutter (21830): Map -> {name: ACE, age: 18, isChecked: false}
I/flutter (21830): Map -> {name: ACE, isChecked: false}
I/flutter (21830): Map -> {name: ACE, isChecked: false}
I/flutter (21830): Map -> {name: ACE}
I/flutter (21830): Map -> {}

7. cast

????castMap.castFrom() 類似,用于將 Map 數(shù)據(jù)類型提升至其他 Map 一致莉擒;

Map<String, dynamic> map = {'name': 'ACE', 'age': 18, 'isChecked': false};
Map map13 = map.cast();
print('Map -> $map -> $map13 -> ${map.runtimeType} -> ${map13.runtimeType}');

Map<dynamic, dynamic> map14 = map.cast();
print('Map -> $map -> $map14 -> ${map.runtimeType} -> ${map14.runtimeType}');

I/flutter (28054): Map -> {name: ACE, age: 18, isChecked: false} -> {name: ACE, age: 18, isChecked: false} -> _InternalLinkedHashMap<String, dynamic> -> CastMap<String, dynamic, dynamic, dynamic>
I/flutter (28054): Map -> {name: ACE, age: 18, isChecked: false} -> {name: ACE, age: 18, isChecked: false} -> _InternalLinkedHashMap<String, dynamic> -> CastMap<String, dynamic, dynamic, dynamic>

基本屬性

1. keys & values & entries

????Map 通過 get() 獲取集合中的 key-value 數(shù)據(jù)內(nèi)容酿炸,entries 為獲取對(duì)應(yīng)迭代的鍵值對(duì)集合;

Map map = {'name': 'ACE', 'age': 18, 'isChecked': false};

print('Map -> ${map.keys} -> ${map.keys.length} -> ${map.keys.toList().first} -> ${map.keys.toList().last}');
print('Map -> ${map.values} -> ${map.values.length} -> ${map.values.toList().first} -> ${map.values.toList().last}');
print('Map -> ${map.entries} -> ${map.entries.length} -> ${map.entries.toList().first} -> ${map.entries.toList().last}');

I/flutter (28054): Map -> (name, age, isChecked) -> 3 -> name -> isChecked
I/flutter (28054): Map -> (ACE, 18, false) -> 3 -> ACE -> false
I/flutter (28054): Map -> (MapEntry(name: ACE), MapEntry(age: 18), MapEntry(isChecked: false)) -> 3 -> MapEntry(name: ACE) -> MapEntry(isChecked: false)

2. isEmpty & isNotEmpty

????isEmpty & isNotEmpty 用于判斷 Map 是否為空集合涨冀;

Map map = {'name': 'ACE', 'age': 18, 'isChecked': false};

print('Map -> ${map.isEmpty} -> ${map.isNotEmpty}');

I/flutter (28054): Map -> false -> true

3. length

????length 用于獲取 Map 中鍵值對(duì)數(shù)量填硕;

Map map = {'name': 'ACE', 'age': 18, 'isChecked': false};

print('Map -> ${map.length}');

I/flutter (28054): Map -> 3

小擴(kuò)展

Map.of() & Map.from()

????Map.of() 和 Map.from() 都是創(chuàng)建與其他 Map key-value 一致的 LinkedHashMap 對(duì)象;區(qū)別在于 Map.of() 必須與其他的 Map 數(shù)據(jù)類型一致鹿鳖;

Map<dynamic, dynamic> map = {'name': 'ACE', 'age': 18, 'isChecked': false};

Map<String, dynamic> map03 = Map.from(map);
map03['isChecked'] = true;
print('Map -> $map -> $map03');

// 異常 type '_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'Map<String, dynamic>'
Map<String, dynamic> map02 = Map.of(map);
map02['isChecked'] = true;
print('Map -> $map -> $map02');

????小菜對(duì) Map 的嘗試暫時(shí)告一段落扁眯,并非很高深的內(nèi)容,只是有個(gè)別屬性小菜用的不熟悉翅帜,進(jìn)行系統(tǒng)的了解一下姻檀;如有錯(cuò)誤,請(qǐng)多多指導(dǎo)涝滴!

來源: 阿策小和尚

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绣版,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子歼疮,更是在濱河造成了極大的恐慌杂抽,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件韩脏,死亡現(xiàn)場(chǎng)離奇詭異缩麸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)赡矢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門匙睹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愚屁,“玉大人济竹,你說我怎么就攤上這事痕檬。” “怎么了送浊?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵梦谜,是天一觀的道長。 經(jīng)常有香客問我袭景,道長唁桩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任耸棒,我火速辦了婚禮荒澡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘与殃。我一直安慰自己单山,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布幅疼。 她就那樣靜靜地躺著米奸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪爽篷。 梳的紋絲不亂的頭發(fā)上悴晰,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音逐工,去河邊找鬼铡溪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛泪喊,可吹牛的內(nèi)容都是我干的棕硫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼窘俺,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼饲帅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瘤泪,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤灶泵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后对途,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赦邻,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年实檀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惶洲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片按声。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖恬吕,靈堂內(nèi)的尸體忽然破棺而出签则,到底是詐尸還是另有隱情,我是刑警寧澤铐料,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布渐裂,位于F島的核電站,受9級(jí)特大地震影響钠惩,放射性物質(zhì)發(fā)生泄漏柒凉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一篓跛、第九天 我趴在偏房一處隱蔽的房頂上張望膝捞。 院中可真熱鬧,春花似錦愧沟、人聲如沸裆熙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鞭光,卻和暖如春胯陋,著一層夾襖步出監(jiān)牢的瞬間竭恬,已是汗流浹背脉顿。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拔第,地道東北人咕村。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蚊俺,于是被迫代替她去往敵國和親懈涛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容