Dart数据类型 Dart
内置的数据类型中, 支持以下几种数据类型
numbers
(数字)
strings
(字符串)
booleans
(布尔)
lists
(也被称之为 arrays
)
maps
runes
(用于在字符串中表示Unicode
字符)
symbols
上面的数据类型可以直接使用字面量初始化
1 2 var str = 'this is a string' ;var isStr = true ;
也可以使用构造函数初始化, 由于Dart
中每个变量引用的都是一个对象 – 一个类的实例, 一些内置的类型具有自己的构造函数
Dart
中Numbers
支持两种类型的数字:
int
: 整数值,其取值通常位于-2^53
和2^53
之间, 差不多9*10^16
, 也就是支持16位数字
double
: 64-bit
(双精度) 浮点数,符合IEEE 754
标准
int
其取值通常位于-2^53
和2^53
之间
也就是-9,007,199,254,740,992和9,007,199,254,740,992之间
实际在编译中则是超过19位则会报错
更多可参考问题 1533 了解更多信息
1 2 var bil = 12345678901234567890 ;
一些常用的判断属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 const m1 = 12 ;print (m1.isNegative);print (0. isNegative);print (b32.isFinite);print (m1.isFinite);print (m1.isInfinite);print (m1.isEven);print (m1.isOdd);print (m1.isNaN);print (21. sign); print (-23. sign); print (0. sign); print (-0. sign);
int
数字类型中常用的函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 const m3 = 24 ;print (m3.abs());print (m3.toString());print (m3.modPow(4 , 3 )); print (m3.gcd(16 ));print (m3.remainder(5 ));print (m3.toDouble());print (m3.compareTo(30 ));
double 下面是定义double
的一些方式:
1 2 var y = 1.1 ;var exponents = 1.42e5 ;
double
类型相关的属性使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 print (d0.isNaN);print (d0.isInfinite);print (d0.isFinite);print (d0.isNegative);print (d0.hashCode);print (d0.sign);print (-1.23 .sign);print (0.0 .sign);print (d0.runtimeType);
double
类型相关方法的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 print (d0.toString());print (d0.toInt());print (d0.compareTo(30 ));print (d0.abs());print (d0.round()); print (d0.ceil()); print (d0.floor()); print (d0.roundToDouble()); print (d0.ceilToDouble()); print (d0.floorToDouble()); print (d0.toStringAsFixed(2 )); print (d0.toStringAsPrecision(10 )); 1.toStringAsExponential(3); // 1.000e+0 123456.toStringAsExponential(3); // 1.235e+5 /
Booleans
为了代表布尔值,Dart
有一个名字为bool
的类型。
只有两个对象是布尔类型的:true
和 false
所创建的对象, 这两个对象也都是编译时常量
当Dart
需要一个布尔值的时候,只有true
对象才被认为是true
, 所有其他的值都是flase
; 像 1、 "aString"
、 以及someObject
等值都被认为是false
1 2 3 4 5 6 const m = 1 ;if (m) { print ('是一个布尔值' ); } else { print ('不是一个布尔值' ); }
在Dart
中上面判断语句是合法的代码
但是在Dart
检查模式运行,上面的代码将会抛出一个异常,表示m
变量不是一个布尔值
所以不建议这么使用上述方法进行判断
Strings Dart
字符串是UTF-16
编码的字符序列, 可以使用单引号或者双引号来创建字符串:
1 2 3 4 5 var s1 = 'Single quotes work well for string literals.' ;var s2 = "Double quotes work just as well." ;var s3 = 'It\'s easy to escape the string delimiter.' ;var s4 = "It's even easier to use the other delimiter." ;
字符串的拼接 直接把相邻字符串写在一起,就可以连接字符串了
1 var string = 'name' '+' 'age'
用+把相邻字符串连接起来
1 var string1 = 'name' + '+' + 'age' ;
引用变量
在Dart
中使用$
符号引用变量或者表达式
表达式引用方式: ${表达式}
, 如果表达式是一个变量则{}
可以省略
1 2 3 4 5 6 const num1 = 12 ;const ageStr0 = 'age = $num1 ' ;const ageStr1 = 'age = ${num1} is my age' ;const ageStr2 = 'age = ${num1 * num1} ' ;
多行字符串 使用单引号或双引号的三引号
1 2 3 4 5 6 7 8 const line1 = ''' 道路千万条,安全第一条, 行车不规范,亲人两行泪 ''' ;const line2 = """ 道路千万条,安全第一条, 行车不规范,亲人两行泪 """ ;
转义符号 声明raw字符串(前缀为r)
,在字符串前加字符r
,或者在\
前面再加一个\
,可以避免\
的转义作用,在正则表达式里特别有用
1 2 3 4 print (r'转义字符, \n' );print ('转义字符, \\n' );print ('转义字符, \n' );
属性介绍 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 const string0 = 'https://www.titanjun.top/' ;print (string0[1 ]);print (string0.isEmpty);print ('' .isEmpty); print (string0.isNotEmpty);print ('' .isNotEmpty); print (string0.runes);print (string0.codeUnits);print (string0.hashCode);print (string0.length); print (string0.runtimeType);
方法介绍 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 const string0 = 'https://www.titanjun.top/' ;print ('titan' .compareTo('jun' ));print (string0.toUpperCase());print (string0.toLowerCase());print (string0.substring(0 , 5 )); print (string0.substring(12 )); print (string0.split('.' )); print (string0.split(new RegExp (r"t" ))); const string1 = '\t\ttitanjun top\n' ;print (string1.trim());print (string1.trimLeft());print (string1.trimRight());
endsWith 判断字符串是否以某字符(字符串)结尾, 参数不接受正则表达式
1 2 3 4 const str1 = 'titanjun.top' ;print (str1.endsWith('p' )); print (str1.endsWith('/' )); print (str1.endsWith('top' ));
startsWith 1 bool startsWith(Pattern pattern, [int index = 0 ]);
判断字符串是否以某字符(字符串)开头, 参数接受正则表达式
1 2 3 4 5 const str1 = 'titanjun.top' ;print (str1.startsWith('h' )); print (str1.startsWith('tit' )); print (str1.startsWith('it' , 1 )); print (str1.startsWith(new RegExp (r'[A-Z][a-z]' ), 1 ));
indexOf 1 int indexOf(Pattern pattern, [int start]);
根据指定的字符(字符串)获取其在原字符串中第一次出现的索引值, 顺序是从左到右
可以从指定的索引初开始, 默认从0开始
如果原字符串中没有需要查找的字符(字符串), 则返回值为: -1
1 2 3 4 5 6 const str2 = 'https://www.titanjun.top/' ;print (str2.indexOf('titan' )); print (str2.indexOf('t' , 5 )); print (str2.indexOf(new RegExp (r'[a-z]' ))); print (str2.indexOf('ppp' ));
lastIndexOf 1 int lastIndexOf(Pattern pattern, [int start]);
效果和indexOf
一样, 不同点则是: indexOf
的顺序是从左到右, lastIndexOf
是从右到左
1 2 3 4 5 const str2 = 'https://www.titanjun.top/' ;print (str2.lastIndexOf('t' , 20 )); print (str2.indexOf(new RegExp (r'[a-z]' ))); print (str2.indexOf('ppp' ));
补占位符 1 2 String padLeft(int width, [String padding = ' ' ]);String padRight(int width, [String padding = ' ' ]);
在字符串前后补占位符
参数一: 想要得到的字符串的位数
参数二: 位数不足时, 补充的字符
1 2 3 const str3 = '12' ;print (str3.padLeft(2 , '0' )); print (str3.padRight(3 , '0' ));
contains 1 bool contains(Pattern other, [int startIndex = 0 ]);
判断字符串中是否包含某字符
判断指定索引处的字符是否是某字符
1 2 3 4 5 6 7 bool contains(Pattern other, [int startIndex = 0 ]);const str = 'Dart strings' ;print (str.contains('D' ));print (str.contains(new RegExp (r'[A-Z]' )));print (str.contains('D' , 0 ));print (str.contains(new RegExp (r'[A-Z]' ), 0 ));
替换字符 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 String replaceFirst(Pattern from, String to, [int startIndex = 0 ]);String replaceAll(Pattern from, String replace);String replaceRange(int start, int end, String replacement); const str4 = 'titanjun12--0123' ; print (str4.replaceFirst('t' , 'T' )); print (str4.replaceFirst('12' , '21' , 10 )); print (str4.replaceAll('12' , '21' )); print (str4.replaceAll('t' , 'T' )); print (str4.replaceRange(0 , 5 , 'top' ));
List 在Dart
中List
对象就是其他语言中的数组
创建数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 List ([int length]);List .filled(int length, E fill, {bool growable: false });List .from(Iterable elements, {bool growable: true })List .generate(int length, E generator(int index), {bool growable: true })List .unmodifiable(Iterable elements)
List
如果设置了参数length
(length
不能为负数或null
),那么创建的List
是固定长度的
元素可修改, 元素个数不可修改, 不能删除和增加元素
1 2 3 4 5 var l1 = new List (3 ); print (l1.length); l1.length = 1 ;
如果未设置参数length
,那么List
的长度是0,并且是可增长的
1 2 3 4 5 6 7 var l10 = new List ();var l11 = [];l10.length = 3 ; l10.add(1 );
当使用指定长度创建一个可增长的List
时,仅仅在刚创建后分配长度
1 List growableList = new List ()..length = 500 ;
filled
通过指定长度创建一个固定长度的List
,并初始化每个位置的值
所有的元素都是相同的fill
值。 如果指定的值是一个可变对象,那么List
中所有的元素都是相同的对象,并且是可修改的
1 2 3 4 var l2 = new List .filled(3 , 'l' ); var l3 = new List .filled(2 , []); l3[0 ].add(12 ); print (l3);
from
创建一个包含所有elements
的List
elements
的Iterator
规定了元素的顺序。
当growable
为true
(默认)时,构造函数返回一个可增长的List
。 否则,它返回一个固定长度的List
1 2 3 4 5 6 7 var l5 = new List .from([1 , 2 , 3 , 4 ]);l5.add(5 ); print (l5); var l5 = new List .from([1 , 2 , 3 , 4 ], growable: false );l5.add(5 );
generate
生成一个包含所有值的List
, 根据索引值创建元素
growable
为false
时,创建的List
是固定长度的
1 2 3 4 var l4 = new List .generate(3 , (int i) => i * i);l4.add(14 ); print (l4);
unmodifiable
创建一个包含所有elements
的,不可修改的List
不可修改的List
不能改变它的长度或元素
如果元素本身是不可改变的,那么由此产生的List
也是不可改变的
1 var l6 = new List .unmodifiable([1 , 2 , 3 , 4 ]);
List属性 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 var arr1 = [1 , 2 , 3 , 4 ];print (arr1.first); print (arr1.last); print (arr1.isNotEmpty); print (arr1.isEmpty); print (arr1.length); print (arr1.reversed); print (arr1.iterator);print (arr1.runtimeType); print (arr1.hashCode);print (arr1[2 ]);arr1[1 ] = 11 ; print (arr1);
List方法 增加 1 2 3 4 5 arr1.add(5 ); arr1.addAll([10 , 12 ]);
查找 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 var arr2 = ['one' , 'two' , 'three' , 'one' , 'four' ];print (arr2.contains('one' )); print (arr2.any((item) => item.length > 4 )); print (arr2.every((item) => item.length > 4 )); print (arr2.asMap()); arr2.shuffle(); print (arr2.elementAt(3 ));print (arr2.indexOf('one' )); print (arr2.indexOf('one' , 2 )); print (arr2.indexOf('five' )); print (arr2.lastIndexOf('one' ));print (arr2.lastIndexOf('one' , 3 ));print (arr2.lastIndexOf('five' ));print (arr3.firstWhere((item) => item == 'one' ));print (arr2.singleWhere((item) => item.length == 5 )); arr2 = ['one' , 'two' , 'three' , 'four' ]; print (arr2.skip(2 )); print (arr2.skipWhile((item) => item.length == 3 )); print (arr2.sublist(1 , 3 ));print (arr2.sublist(2 ));print (arr2.getRange(1 , 3 )); print (arr2.join()); print (arr2.join('-' )); print (arr2.take(2 ));arr2 = ['one' , 'two' , 'three' , 'four' , 'ten' ]; print (arr2.takeWhile((item) => item.length == 3 ));
删除 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 var arr2 = ['one' , 'two' , 'three' , 'one' , 'four' ];print (arr2.remove('two' )); print (arr2); print (arr2.remove('five' )); print (arr2.removeAt(1 )); print (arr2); print (arr2.removeLast()); print (arr2); arr2.addAll(['six' , 'seven' , 'eight' ]); arr2.removeRange(1 , 3 ); print (arr2); arr2.removeWhere((item) => item.length == 3 ); print (arr2); arr2.retainWhere((item) => item.length > 3 ); print (arr2);arr1.clear(); print (arr1);
插入 1 2 3 4 5 6 7 8 var arr3 = [1 , 3 , 4 ];arr3.insert(1 , 10 ); print (arr3); arr3.insertAll(2 , [12 , 32 ]); print (arr3);
重要方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 //过滤 Iterable<E> where(bool test(E element)) => new WhereIterable<E>(this, test); // 映射 Iterable<T> map<T>(T f(E e)) => new MappedIterable<E, T>(this, f); // 排序 void sort([int compare(E a, E b)]); // 迭代计算, initialValue: 初始值, combine: 计算函数 T fold<T>(T initialValue, T combine(T previousValue, E element)) // 迭代计算, 初始值即为第一个元素的值, combine: 计算函数 E reduce(E combine(E value, E element)) // 对集合的每个元素,按迭代顺序执行函数操作 void forEach(void f(E element)) // 将Iterable的每个元素扩展为0个或多个元素 Iterable expand(Iterable f(E element))
下面看一下每一个函数的具体使用和介绍
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 var arr2 = ['one' , 'two' , 'three' , 'four' ];print (arr2.where((item) => item.length == 3 )); var array = arr2.map((item) { return item + '-' ; }); print (array.toList()); arr2.sort(); print (arr2); arr2.sort((item1, item2) { return item1.length.compareTo(item2.length); }); print (arr2); var arr4 = [1 , 2 , 3 , 4 ];var result1 = arr4.fold(10 , (prev, value) => prev + value); var result2 = arr4.fold(2 , (prev, value) => prev * value); var result3 = arr4.reduce((value, element) => value * element); arr2.forEach((item) { print (item); }); var pairs = [[1 , 2 ], [3 , 4 ]];var flattened = pairs.expand((pair) => pair).toList();print (flattened); var input = [1 , 2 , 3 ];var duplicated = input.expand((i) => [i, i]).toList();print (duplicated);
由于篇幅太长了, 剩下的一些数据类型下篇文章在继续研究记录吧
参考文献