前情提要
上一篇介紹完Strings
之後,這篇來到Booleans
、Lists
、Sets
、Maps
了,因為Booleans就比較沒甚麼好解說的,就是true
跟false
,因此把另外三個也納進來一起解說,以免篇幅太少,基本上Lists
、Sets
、Maps
也滿好理解的,這些資料型別是其他程式語言常見到的,只要搞清楚三者的差異以及適用時機,基本上就是駕輕就熟了,跟著筆者一起學習吧。
內容
筆者這邊還是簡單列一下筆者這邊的開發環境
- 作業系統:Mac OS
- Dart版本:
2.17.6
- 編輯器:Visual Studio Code
Booleans
這就沒甚麼好解釋的了,true
、false
二擇一
1 | // Check for an empty string. |
Lists
泛型集合List<T>
,亦即可以示List<int>
,也可以是List<string>
,但不能將不同資料型別混著放,Dart
程式語言是Type Safety
的語言,因此編譯時就會噴錯。不意外地,Dart語言中,List
使用zero-based indexing
,這個東西平常看似沒甚麼,但是遇到時心裡就會很OOXX,筆者絕對不是在說JS中的getMonth(),因為常常遇到月份比較時,很自然地忘記它也是zero-based indexing
,因此常常鬼打牆的在偵錯。
宣告方式
1 | var list = [1, 2, 3]; |
Spread Operator
滿特別的一個,筆者在撰寫Angular時特別愛用,畢竟JS
世界裡一切都是物件,因此若想要達到Deep Copy深層複製
時,筆者愛用簡單解法,透過Spread Operator
把每個元素都展開,並指派給新的變數,藉由達到Deep Copy深層複製
的效果,竟然在Dart
程式語言中再次遇見。
1 | var list = [1, 2, 3]; |
Collection If
很特別的一個feature
,在初始化塞值時,可以透過if判斷式,決定要不要塞該元素
1 | // 依照promoActive的值為true或false來決定是否增加'Outlet'這個元素 |
Collection For
這也是跟上述feature
一樣,比較少在其他語言看到的特性,可以透過for迴圈,塞有規則性的多個元素
1 | var listOfInts = [1, 2, 3]; |
相關操作API
isEmpty:
判斷是否為空集合add:
新增一筆元素addAll:
新增多個元素length:
取得集合大小removeAt:
透過指定元素位置刪除(搭配indexOf
找到元素所在位置)clear:
清空集合filled:
透過List提供的Constructor
新增指定元素並且依照指定次數增加sort
:排序,可搭配使用compareTo
使用自己指定的比較方法排序
1 | // Create an empty list of strings. |
1 | var fruits = ['bananas', 'apples', 'oranges']; |
完整API
資訊,請參考
https://api.dart.dev/stable/2.17.6/dart-core/List-class.html
Sets
泛型集合,與List
不一樣的地方在於,Set
每個元素都是唯一的,不能重複出現
A collection of objects in which each object can occur only once.
宣告方式
還記得List
的宣告方式吧,[1, 2, 3]
的方式,Set則是{ 1, 2, 3}
1 | var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'}; |
空集合的宣告方式則
1 | // 讓Dart編譯器知道是Set<string> |
相關操作API,就不特別列出,因為大同小異,要特別提醒的是
A set in Dart is an unordered collection of unique items. Because a set is unordered, you can’t get a set’s items by index (position).
其他詳細API
參考
https://api.dart.dev/stable/2.17.6/dart-core/Set-class.html
Maps
Maps
結構就是Map<Tkey, TValue>(key, value)
型式的一種資料型別,簡單點解釋的話,即是Dictionary
字典型式的資料型別
宣告方式
1 | var gifts = { |
Map
部份,相關操作與Collection
其他家族Set
、Map
大同小異,而筆者想要經驗分享的是,Dictionary
顧名思義,key
是獨一無二的,因此每次在add
時,記得使用containsKey
這個API
做檢查,讓你少走一點冤望路。
詳細API
參考
https://api.dart.dev/stable/2.17.6/dart-core/Map-class.html
結論
趕緊在結束之前說一下List介紹中提到的
Spread Operator
Collection If
Collection For
因為List
、Set
、Map
皆屬於Collection大家族,因此皆適用。
List
、Set
、Map
要如何使用呢,一般情況使用List
就可以解決大部份的問題,若想要集合的元素不重複時,可以考慮使用Set
這個資料結構來存放,但注意Set
這個沒有indexOf
這個API
可以使用,接著那種key、value
式的就可以考慮使用Map
來操作。
基本上記得每個資料結構的特性,搭配各自的API
文件說明,筆者想應付一般應用程式是綽綽有餘的,筆者還是鼓勵一貫的做法,先理解一下能做到甚麼就好,理解的程度到在遇到問題時腦中有一些keyword浮現即可,然而真正要用到時再去深究它,畢竟腦容量有限,希望這篇文章對大家有幫助。
參考
- https://dart.dev/guides/language/language-tour#lists
- https://dart.dev/guides/language/language-tour#sets
- https://dart.dev/guides/language/language-tour#maps
- https://dart.dev/guides/libraries/library-tour#collections
- https://stackoverflow.com/questions/27897932/sorting-ascending-and-descending-in-dart