Dart —— dart:core 集合

Dart彙總請點擊這裏

Dart 附帶了核心集合 API ,其中包括 list ,set 和 map 類。

Lists

如Dart基礎中介紹,lists 可以通過字面量來創建和初始化。 另外,也可以使用 List 的構造函數。

List 類還定義了若干方法,用於向列表添加或刪除項目。

// 使用 List 構造函數。
var vegetables = List();

// 或者僅使用一個 list 字面量。
var fruits = ['apples', 'oranges'];

// 添加一個元素到 list 對象。
fruits.add('kiwis');

// 添加多個元素到 list 對象。
fruits.addAll(['grapes', 'bananas']);

// 獲取 list 長度。
assert(fruits.length == 5);

// 移除一個元素到 list 對象。
var appleIndex = fruits.indexOf('apples');
fruits.removeAt(appleIndex);
assert(fruits.length == 4);

// 移除多個元素到 list 對象。
fruits.clear();
assert(fruits.length == 0);

使用 indexOf() 方法查找一個對象在 list 中的下標值。

var fruits = ['apples', 'oranges'];

// 使用下標訪問 list 中的元素
assert(fruits[0] == 'apples');

// 查找一個元素在 list 中的下標。
assert(fruits.indexOf('apples') == 0);

使用 sort() 方法排序一個 list 。

你可以提供一個排序函數用於比較兩個對象。 比較函數在 小於 時返回 <0,相等 時返回 0,大於 時返回 > 0 。 下面示例中使用 compareTo() 函數, 該函數在 Comparable 中定義, 並被 String 類實現。

var fruits = ['bananas', 'apples', 'oranges'];

// 排序一個 list 。
fruits.sort((a, b) => a.compareTo(b));
assert(fruits[0] == 'apples');

list 是參數化類型, 因此可以指定 list 應該包含的元素類型:

// 這個 list 只能包含字符串類型。
var fruits = List<String>();

fruits.add('apples');
var fruit = fruits[0];
assert(fruit is String);

// 產生靜態分析警告,num 不是字符串類型。
fruits.add(5); // BAD: Throws exception in checked mode.
fruits.add(5); // Error: 'int' can't be assigned to 'String'

Sets

在 Dart 中,set 是一個無序的,元素唯一的集合。 因爲一個 set 是無序的,所以無法通過下標(位置)獲取 set 中的元素。

添加移除元素

var ingredients = Set();
ingredients.addAll(['gold', 'titanium', 'xenon']);
assert(ingredients.length == 3);

// 添加一個重複的元素是無效的。
ingredients.add('gold');
assert(ingredients.length == 3);

// 從 set 中移除一個元素。
ingredients.remove('gold');
assert(ingredients.length == 2);

使用 contains() 和 containsAll() 來檢查一個或多個元素是否在 set 中。

var ingredients = Set();
ingredients.addAll(['gold', 'titanium', 'xenon']);

// 檢查一個元素是否在該 set 中。
assert(ingredients.contains('titanium'));

// 檢查多個元素是否在該 set 中。
assert(ingredients.containsAll(['titanium', 'xenon']));

交集是另外兩個 set 中的公共元素組成的 set 。

var ingredients = Set();
ingredients.addAll(['gold', 'titanium', 'xenon']);

// 創建兩個 set 的交集。
var nobleGases = Set.from(['xenon', 'argon']);
var intersection = ingredients.intersection(nobleGases);
assert(intersection.length == 1);
assert(intersection.contains('xenon'));

Maps

map 是一個無序的 key-value (鍵值對)集合,就是大家熟知的 dictionary 或者 hash。 map 將 kay 與 value 關聯,以便於檢索。和 JavaScript 不同,Dart 對象不是 map 。

聲明 map 可以使用簡潔的字面量語法,也可以使用傳統構造函數:

// map 通常使用字符串作爲 key。
var hawaiianBeaches = {
  'Oahu': ['Waikiki', 'Kailua', 'Waimanalo'],
  'Big Island': ['Wailea Bay', 'Pololu Beach'],
  'Kauai': ['Hanalei', 'Poipu']
};

// map 可以通過構造函數構建。
var searchTerms = Map();

// map 是參數化類型;
// 可以指定一個 map 中 key 和 value 的類型。
var nobleGases = Map<int, String>();

通過大括號語法可以爲 map 添加,獲取,設置元素。 使用 remove() 方法從 map 中移除鍵值對。

var nobleGases = {54: 'xenon'};

// 使用 key 檢索 value 。
assert(nobleGases[54] == 'xenon');

// 檢查 map 是否包含 key 。
assert(nobleGases.containsKey(54));

// 移除一個 key 及其 value。
nobleGases.remove(54);
assert(!nobleGases.containsKey(54));

可以從一個 map 中檢索出所有的 key 或所有的 value:

var hawaiianBeaches = {
  'Oahu': ['Waikiki', 'Kailua', 'Waimanalo'],
  'Big Island': ['Wailea Bay', 'Pololu Beach'],
  'Kauai': ['Hanalei', 'Poipu']
};

// 獲取的所有的 key 是一個無序集合
// (可迭代 list 對象)。
var keys = hawaiianBeaches.keys;

assert(keys.length == 3);
assert(Set.from(keys).contains('Oahu'));

// 獲取的所有的 value 是一個無序集合
// (可迭代 list 對象).
var values = hawaiianBeaches.values;
assert(values.length == 3);
assert(values.any((v) => v.contains('Waikiki')));

使用 containsKey() 方法檢查一個 map 中是否包含某個key 。

因爲 map 中的 value 可能會是 null , 所有通過 key 獲取 value,並通過判斷 value 是否爲 null 來判斷 key 是否存在是不可靠的。

var hawaiianBeaches = {
  'Oahu': ['Waikiki', 'Kailua', 'Waimanalo'],
  'Big Island': ['Wailea Bay', 'Pololu Beach'],
  'Kauai': ['Hanalei', 'Poipu']
};

assert(hawaiianBeaches.containsKey('Oahu'));
assert(!hawaiianBeaches.containsKey('Florida'));
如果當且僅當該 key 不存在於 map 中,且要爲這個 key 賦值, 可使用putIfAbsent()方法。 該方法需要一個方法返回這個 value 。

var teamAssignments = {};
teamAssignments.putIfAbsent(
    'Catcher', () => pickToughestKid());
assert(teamAssignments['Catcher'] != null);

公共集合方法

List, Set, 和 Map 共享許多集合中的常用功能。 其中一些常見功能由 Iterable 類定義, 這些函數由 List 和 Set 實現。

雖然Map沒有實現 Iterable, 但可以使用 Map keys 和 values 屬性從中獲取 Iterable 對象。

使用 isEmpty 和 isNotEmpty 方法可以檢查 list, set 或 map 對象中是否包含元素:

var coffees = [];
var teas = ['green', 'black', 'chamomile', 'earl grey'];
assert(coffees.isEmpty);
assert(teas.isNotEmpty);

使用 forEach() 可以讓 list, set 或 map 對象中的每個元素都使用一個方法。

var teas = ['green', 'black', 'chamomile', 'earl grey'];

teas.forEach((tea) => print('I drink $tea'));

當在 map 對象上調用 `forEach() 方法時,函數必須帶兩個參數(key 和 value):

hawaiianBeaches.forEach((k, v) {
  print('I want to visit $k and swim at $v');
  // 我想去瓦胡島並且在
  // [Waikiki, Kailua, Waimanalo]游泳, 等等。
});

Iterable 提供 map() 方法,這個方法將所有結果返回到一個對象中。

var teas = ['green', 'black', 'chamomile', 'earl grey'];

var loudTeas = teas.map((tea) => tea.toUpperCase());
loudTeas.forEach(print);

map() 方法返回的對象是一個 懶求值(lazily evaluated)對象: 只有當訪問對象裏面的元素時,函數纔會被調用。

使用 map().toList() 或 map().toSet() , 可以強制在每個項目上立即調用函數。

var loudTeas =
    teas.map((tea) => tea.toUpperCase()).toList();

使用 Iterable 的 where() 方法可以獲取所有匹配條件的元素。

使用 Iterable 的 any() 和 every() 方法可以檢查部分或者所有元素是否匹配某個條件。

var teas = ['green', 'black', 'chamomile', 'earl grey'];

// 洋甘菊不含咖啡因。
bool isDecaffeinated(String teaName) =>
    teaName == 'chamomile';

// 使用 where() 來查找元素,
// 這些元素在給定的函數中返回 true 。
var decaffeinatedTeas =
    teas.where((tea) => isDecaffeinated(tea));
// 或者 teas.where(isDecaffeinated)

// 使用 any() 來檢查集合中是否至少有一個元素滿足條件。
assert(teas.any(isDecaffeinated));

// 使用 every() 來檢查集合中是否所有元素滿足條件。
assert(!teas.every(isDecaffeinated));
發佈了80 篇原創文章 · 獲贊 44 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章