Dart
过程当中所记录的学习笔记, 都是一些基础知识, 几乎没什么技术含量, 主要是方便后期使用的时候方便查阅key-value
键值对(可使用相关联的key
检索value
值)的集合, 即传说中的字典Map
中key
的数量是有限的,每一个key
正好有一个相关的value
Map
、以及它的键和值,都是能够迭代的, 迭代的顺序由Map
不一样的类型定义
HashMap
是无序的,这意味着它迭代的顺序是不肯定的LinkedHashMap
按key
的插入顺序进行迭代SplayTreeMap
按key
的排序顺序进行迭代Map
的一个操做正在执行的时候,一般不容许修改Map
(添加或删除key
)Map()
// 建立一个Map实例,默认实现是LinkedHashMap。
Map.from(Map other)
// 建立一个LinkedHashMap实例,包含other的全部键值对。
Map.fromIterable(Iterable iterable, {K key(element), V value(element)})
// 建立一个Map实例,其中Key和Value由iterable的元素计算获得。
Map.fromIterables(Iterable<K> keys, Iterable<V> values)
// 将指定的keys和values关联,建立一个Map实例。
Map.identity()
// 使用默认实现LinkedHashMap建立一个严格的Map。
Map.unmodifiable(Map other)
// 建立一个不可修改、基于哈希值的Map,包含other全部的项
复制代码
每一种建立方式的具体使用html
// 建立一个Map实例, 插入顺序进行排列
var dic = new Map();
print(dic); // {}
// 根据一个Map建立一个新的Map, 插入顺序进行排列
var dic1 = new Map.from({'name': 'titan'});
print(dic1); // {name: titan}
// 根据List建立Map, 插入顺序进行排列
List<int> list = [1, 2, 3];
// 使用默认方式, key和value都是数组对应的元素
var dic2 = new Map.fromIterable(list);
print(dic2); // {1: 1, 2: 2, 3: 3}
// 设置key和value的值
var dic3 = new Map.fromIterable(list, key: (item) => item.toString(), value: (item) => item * item);
print(dic3); // {1: 1, 2: 4, 3: 9}
// 两个数组映射一个字典, 插入顺序进行排列
List<String> keys = ['name', 'age'];
var values = ['jun', 20];
// 若是有相同的key值, 后面的值会覆盖前面的值
var dic4 = new Map.fromIterables(keys, values);
print(dic4); // {name: jun, age: 20}
// 建立一个空的Map, Map容许null做为key
var dic5 = new Map.identity();
print(dic5); //{}
// 建立一个不可修改、基于哈希值的Map
var dic6 = new Map.unmodifiable({'name': 'titan'});
print(dic6);
复制代码
Map
中相关属性和一些经常使用属性的操做以下:api
var map1 = {'name': 'titan', 'age': 20};
// 哈希值
print(map1.hashCode);
// 运行时类型
print(map1.runtimeType); //_InternalLinkedHashMap<String, Object>
// 是否为空, null不能判断, 会报错
print(map1.isEmpty); // false
// 是否不为空
print(map1.isNotEmpty); // true
// 键值对个数
print(map1.length); // 2
// 全部的key值, 返回Iterable<K>类型
print(map1.keys.toList()); // [name, age]
// 全部的value值, 返回Iterable<K>类型
print(map1.values.toList()); // [titan, 20]
// 根据key取值
print(map1['name'] ?? ''); // titan
// 根据key赋值
map1['age'] = 30;
print(map1); // {name: titan, age: 30}
复制代码
var map2 = {'name': 'titan', 'age': 20};
// 添加一个map
map2.addAll({'blog': 'titanjun'});
print(map2);
// {name: titan, age: 20, blog: titanjun}
// 判断是否包含指定的key
print(map2.containsKey('age')); //
// 判断是否包含指定的value
print(map2.containsValue('titan'));
// 操做每一个键值对
map2.forEach((key, value) {
print('key = $key, value = $value');
});
// 查找key对应的value,或添加一个新的值为key.length的value
for (var key in ['name', 'age', 'king']) {
// 函数的返回值为查找到的对应的value值
print(map2.putIfAbsent(key, () => key.length));
}
print(map2);
// {name: titan, age: 20, blog: titanjun, king: 4}
// 转成字符串
print(map2.toString());
// 删除键值对, 返回删除key对应的value值, 没有则返回null
print(map2.remove('blog')); //titanjun
print(map2.remove('coder')); //null
print(map2);
// 删除全部的键值对
map2.clear();
print(map2); //{}
复制代码
List
集合也是继承于Iterable
List
和Set
也是Iterable
,dart:collection
库中一样有不少Iterable
集合能够被修改
List
或Set
添加元素将改变对象全部包含的元素。Key
会改变全部Map.keys
的元素。// 建立空的可迭代对象
var ite = Iterable.empty();
print(ite); // ()
// 建立一个Iterable,经过序列来动态生成元素
var ite1 = Iterable.generate(5);
print(ite1); // (0, 1, 2, 3, 4)
复制代码
至于Iterable
的全部属性和函数的介绍和使用, 在上篇文章Flutter开发之Dart的数据类型01中的List
模块中已经详细介绍了, 由于List
是继承于Iterable
的, 因此Iterable
有的属性和方法List
中都有数组
Dart
中,Runes
表明字符串的UTF-32
字符集, 另外一种Strings
Unicode
为每个字符、标点符号、表情符号等都定义了 一个惟一的数值Dart
字符串是UTF-16
的字符序列,因此在字符串中表达32的字符序列就须要新的语法了\uXXXX
的方式来表示, 这里的XXXX
是4个16进制的数, 如,心形符号(♥)
是\u2665
emoji
(😆) 是\u{1f600}
String
类有一些属性能够提取rune
信息
codeUnitAt
和codeUnit
属性返回16为字符runes
属性来获取字符串的runes
信息var clapping = '\u{1f44f}';
print(clapping); // 👏
print(clapping.codeUnits); // [55357, 56399]
print(clapping.runes.toList()); // [128079]
复制代码
// 根据字符串建立
Runes runes = new Runes('\u2665, \u{1f605}, \u{1f60e}');
print(runes);
// (9829, 44, 32, 128517, 44, 32, 128526)
// 输出特殊字符的字符串
print(new String.fromCharCodes(runes));
// ♥, 😅, 😎
复制代码
因为Runes
也是继承于Iterable
, 因此Runes
中的属性和方法的使用也和Iterable
同样, 详情参考Runes和Flutter开发之Dart的数据类型01中的介绍微信
Symbol
对象表明Dart
程序中声明的操做符或者标识符Symbol
,可是该功能对于经过名字来引用标识符的状况 是很是有价值的,特别是混淆后的代码,标识符的名字被混淆了,可是Symbol
的名字不会改变Symbol
字面量来获取标识符的symbol
对象,也就是在标识符前面添加一个 #
符号// 获取symbol 对象
var sym1 = Symbol('name');
print(sym1); // Symbol("name")
// #号建立
var sym2 = #titan;
print(sym2); // Symbol("titan")
复制代码
List
中一个对象能够出现屡次HashSet
是无序的,这意味着它迭代的顺序是不肯定的LinkedHashSet
按元素的插入顺序进行迭代SplayTreeSet
按排序顺序迭代元素Set
除建立方式和List
不一样, 其余属性和方法基本同样// 建立一个空的Set。
var set1 = Set();
print(set1); // {}
// 建立一个包含全部elements的Set
var set2 = Set.from([1, 2, 3]);
print(set2); // {1, 2, 3}
// 建立一个空的,元素严格相等的Set
var set3 = Set.identity();
print(set3); // {}
复制代码
// set2 = {1, 2, 3}
//返回一个新的Set,它是this和other的交集
var set4 = Set.from([2, 3, 5, 6]);
print(set2.intersection(set4)); //{2, 3}
// 返回一个新的Set,它包含this和other的全部元素(并集)
print(set2.union(set4)); // {1, 2, 3, 5, 6}
// 检查Set中是否包含object, 有则返回该object, 没有则返回null
print(set4.lookup(5)); // 5
print(set4.lookup(21)); // null
复制代码
其余更多属性参考Set和Flutter开发之Dart的数据类型01中的介绍app
Duration
表示从一个时间点到另外一个时间点的时间差Duration
多是负数// 惟一的构造函数建立Duration对象
Duration({int days: 0, int hours: 0, int minutes: 0, int seconds: 0, int milliseconds: 0, int microseconds: 0})
// 可使用其中的一个或者几个参数建立
// 只是用其中的一个参数
Duration ration = Duration(days: 1);
print(ration); //24:00:00.000000
Duration ration1 = Duration(hours: 10);
print(ration1); //10:00:00.000000
// 只是用其中的两个参数
Duration ration2 = Duration(days: 1, hours: 3);
print(ration2); //27:00:00.000000
// 使用全部的参数
Duration ration3 = Duration(days: 2, hours: 2, minutes: 23, seconds: 34, milliseconds: 56, microseconds: 89);
print(ration3); //50:23:34.056089
复制代码
Duration time1 = Duration(days: 1, hours: 1, minutes: 1, seconds: 1, milliseconds: 1, microseconds: 1);
Duration time2 = Duration(days: 2, hours: 2, minutes: 2, seconds: 2, milliseconds: 2, microseconds: 2);
print(time1); //25:01:01.001001
print(time2); //50:02:02.002002
// 加
print(time1 + time2); //75:03:03.003003
// 减
print(time1 - time2); //-25:01:01.001001
// 乘
print(time1 * 2); //50:02:02.002002
// 除(取整)
print(time2 ~/ 3); //16:40:40.667334
// 比较
print(time1 > time2); //false
print(time1 >= time2); //false
print(time1 == time2); //false
print(time1 < time2); //true
print(time1 <= time2); //true
// 取相反值
print(-time1); //-25:01:01.001001
print(-(time1 - time2)); //25:01:01.001001
复制代码
Duration time3 = -Duration(days: 1, hours: 1, minutes: 1, seconds: 1, milliseconds: 1, microseconds: 1);
print(time3); //-25:01:01.001001
// 取绝对值
print(time3.abs()); //25:01:01.001001
// 比较, 返回值, 0: 相等, -1: time1 < time2, 1: time1 > time2
print(time1.compareTo(time2)); //-1
// 字符串形式
print(time1.toString());
复制代码
DateTime
对象,而且符合ISO 8601
标准的子集,小时是24小时制,范围在0-23之间DateTime
对象建立以后,将是固定不变的, 不可被修改DateTime
对象默认使用的是本地时区,除非显示地指定UTC
时区// 当前时间
var date1 = new DateTime.now();
print(date1); //2019-02-23 16:43:15.505305
// 构造一个指定为本地时区的DateTime
//DateTime(int year, [int month = 1, int day = 1, int hour = 0, int minute = 0, int second = 0, int millisecond = 0, int microsecond = 0])
var date2 = new DateTime(2018, 10, 3, 12, 23, 34, 562, 1002);
print(date2); //2018-10-03 12:23:34.563002
// 用微秒建立
var date3 = new DateTime.fromMicrosecondsSinceEpoch(1000222);
// isUtc: true: UTC时区, 默认false
var date31 = new DateTime.fromMicrosecondsSinceEpoch(1000222, isUtc: true);
print(date3); //1970-01-01 08:00:01.000222
// 用毫秒建立
var date4 = new DateTime.fromMillisecondsSinceEpoch(1000222);
// isUtc: true: UTC时区, 默认false
var date41 = new DateTime.fromMillisecondsSinceEpoch(1000222, isUtc: true);
print(date4); //1970-01-01 08:16:40.222
// 指定为UTC时区的时间
var date5 = new DateTime.utc(1969, 7, 20, 20, 18, 04);
print(date5); //1969-07-20 20:18:04.000Z
复制代码
DateTime parse(String formattedString)
复制代码
DateTime
T
或一个空格分开
.
加1-6位数的秒数可选:
分隔z
或Z
,或者是一个有正负之分的2位数的小时部分,和可选的2位数的分钟部分+
或-
,而且不能省略:
分隔"2012-02-27 13:27:00"
"2012-02-27 13:27:00.123456z"
"20120227 13:27:00"
"20120227T132700"
"20120227"
"+20120227"
"2012-02-27T14Z"
"2012-02-27T14+00:00"
"-123450101 00:00:00 Z"
:年份为-12345"2002-02-27T14:00:00-0500"
: 与"2002-02-27T19:00:00Z"
相同// 格式化时间字符串
var date6 = DateTime.parse("2012-02-27 13:27:00");
var date7 = DateTime.parse('20120227T132700');
print(date6); // 2012-02-27 13:27:00.000
print(date7); // 2012-02-27 13:27:00.000
复制代码
var time = DateTime.parse("2019-02-25 13:27:04");
// 获取年-月-日-周几
print(time.year); //2019
print(time.month); //2
print(time.day); //25
print(time.weekday);//1
// 获取时-分-秒-毫秒-微秒
print(time.hour); //13
print(time.minute); //27
print(time.second); //4
print(time.millisecond);//0
print(time.microsecond);//0
// 是否是utc时区
print(time.isUtc);
//1970-01-01T00:00:00Z (UTC)开始通过的微秒数
print(time.microsecondsSinceEpoch);
//1970-01-01T00:00:00Z (UTC)开始通过的毫秒数
print(time.millisecondsSinceEpoch);
//平台提供的时区名称
print(time.timeZoneName);
//时区偏移量,即本地时间和UTC之间的时间差
print(time.timeZoneOffset);
复制代码
// 获取当前时间
DateTime today = new DateTime.now();
print(today); //2019-02-28 11:18:16.198088
//加上duration,返回一个新的DateTime实例
DateTime newDay = today.add(new Duration(days: 60));
print(newDay); //2019-04-29 11:18:16.198088
//减去duration,返回一个新的DateTime实例
DateTime newDay1 = today.subtract(new Duration(days: 60));
print(newDay1); //2018-12-30 11:25:31.741382
// 比较两个时间值的大小, 0: 相等, -1: 前值<后值, 1: 前值>后值
var isCom = today.compareTo(newDay);
print(isCom); // -1
// 计算两个时间的差值
Duration duration = today.difference(newDay);
print(duration); //-1440:00:00.000000
// 比较两个时间
print(today.isAfter(newDay)); // false
print(today.isBefore(newDay)); // true
// 比较是不是同一时刻
print(today.isAtSameMomentAs(newDay)); //false
// 返回此DateTime在本地时区的值
print(today.toLocal()); //2019-02-28 11:30:51.713069
复制代码
欢迎您扫一扫下面的微信公众号,订阅个人博客!ide