Dart
Dart 是一种面向对象的编程语言,由 Google 开发,是 Flutter 框架的开发语言。
变量声明
var
自动类型推断const
编译时常量final
运行时常量
dart
var name = 'Alice'; // 自动推断类型
String city = 'Tokyo'; // 显式类型
const pi = 3.1415; // 编译时常量
final time = DateTime.now(); // 运行时常量
基本数据类型
Number
数值类型String
字符串Boolean
布尔值List
列表Set
集合Map
映射
数值类型(int、double、num)
dart
int age = 30;
double pi = -3.1415;
num anyNumber = 10; // num 可存 int 或 double
age.toString(); // '30'
pi.toInt(); // -3 向下取整
pi.ceil(); // -3 向上取整
pi.round(); // -3 四舍五入
pi.abs(); // 3.1415 取绝对值
3.1415.toStringAsFixed(2); // '3.14' 保留两位小数
10.remainder(3); // 1 取余
// 比较大小
10.compareTo(5); // 1 大于
10.compareTo(15); // -1 小于
10.compareTo(10); // 0 等于
字符串类型
' '
" "
''' '''
dart
String str1 = 'hello';
String str2 = "world";
// 多行字符串
var str3 = '''hello,
world
'''
print(str1 + str2); // helloworld
print("$str1, $str2"); // hello, world
print(str1.split('')); // [h, e, l, l, o]
' abc '.trim(); // 'abc' 去除首尾空格
' abc '.trimLeft(); // 'abc ' 去除左边空格
' abc '.trimRight(); // ' abc' 去除右边空格
// 判断是否为空
'str1'.isEmpty; // false
'str1'.isNotEmpty; // true
// 替换
'str1'.replaceAll('1', '2'); // str2
'a1b1c1'.replaceAll(RegExp(r'\d'), '_'); // a_b_c
// 截取
'str1'.substring(0, 2); // st
// 查找
'str1'.contains('1'); // true
// 定位
'str1'.indexOf('1'); // 1
'str1'.lastIndexOf('1'); // 1
// 转换为大写
'str1'.toUpperCase(); // STR1
// 转换为小写
'str1'.toLowerCase(); // str1
正则表达式
dart
RegExp(r'\d+'); // 匹配一个或多个数字
RegExp exp = RegExp(r'[a-z]'); // 匹配小写字母
// 匹配
exp.hasMatch('abc'); // true
RegExp(r'^1\d{10}$').hasMatch('123'); // false
布尔类型
dart
bool isTrue = true;
bool isFalse = false;
// 显示的进行判断
var flag;
if (flag == true) {
print('true');
} else {
print('false');
}
// 检查是否为 NaN(Not a Number)
0 / 0.isNaN; // true
isFinite(0); // true 有限
isInfinite(0); // false 无限
isNegative(0); // false 非负数
列表类型 List
dart
List list1 = []; // 不限制类型空列表
List<int> lst2 = [1, 2, 3, 4, 5]; // 整数列表
List list3 = new List.empty(growable: true); // 不限制类型列表
List list4 = new List.filled(3, 6); // 固定长度3 固定内容6的列表 [6 6 6]
// ... ...?
[0, ...?list4]; // [0, 6, 6, 6]
// 添加
[1].add(2); // [1, 2]
[1, 2].addAll([3, 4]); // [1, 2, 3, 4]
[1, 2, 3, 4].insert(1, 5); // [1, 5, 2, 3, 4]
// 删除
[1, 2, 3, 4].remove(2); // [1, 3, 4]
// 删除索引
[1, 2, 3, 4].removeAt(1); // [1, 3, 4]
// 清空
[1, 2, 3, 4].clear(); // []
// 连接
[1, 2, 3].join('-'); // '1-2-3'
// 长度
list4.length; // 3
// 反转
[1,2,3,4].reversed.toList(); // [4, 3, 2, 1]
// 查找索引
[1, 2, 3, 4].indexOf(3); // 2
// 查找最后一个索引
[1, 2, 3, 4].lastIndexOf(3); // 2
// 遍历
for (var i = 0; i < [1, 2, 3, 4].length; i++) {
print(element);
};
for (var element in [1, 2, 3, 4]) {
print(element);
};
[1, 2, 3, 4].forEach((element) {
print(element);
});
// 映射
[1, 2, 3, 4].map((e) => e * 2).toList(); // [2, 4, 6, 8]
// 过滤
[1, 2, 3, 4].where((element) => element > 2).toList(); // [3, 4]
// 任意一个满足
[1, 2, 3, 4].any((element) => element > 2); // true
// 所有满足
[1, 2, 3, 4].every((element) => element > 2); // false
// 展开
[[1, 2], 3].expand((element) => [element, element]).toList(); // [1, 2, 3]
// 折叠 1+ 1+2+3
[1, 2, 3].fold(1, (prev, element) => prev + element); // 1+1+2+3=7
集合类型 Set
没有下标、 不重复
dart
var set1 = <int>[1, 2, 3]; // {1, 2, 3}
var set2 = new Set();
set2.add(1); // {1}
set2.addAll([3, 4]); // {1, 2, 3, 4}
set2.toList(); // [1, 2, 3, 4]
// 交集
set1.intersection(set2); // {1, 2, 3}
// 并集
set1.union(set2); // {1, 2, 3, 4}
// 差集
set1.difference(set2); // {2, 3}
{1, 2, 3}.first; // 1
{1, 2, 3}.last; // 3
映射类型 键值对
dart
var map1 = {'a': 1, 'b': 2};
var map2 = new Map();
var map3 = Map();
map3['name'] = 'zhangsan';
map3['age'] = 18;
// 访问属性
map3['name']; // 'zhangsan'
// 检查是否包含键key
map3.containsKey('name'); // true
// 不存在key 则添加
map3.putIfAbsent('sex', () => 'nan');
// 获取所有的key
map3.keys; // ['name', 'age']
// 获取所有的value
map3.values; // ['zhangsan', 18]
map3.remove('name'); // 'zhangsan'
// 移除满足条件的键值对
map3.removeWhere((key, value) => key == 'age');
数据类型转换
toInt()
转换为整数 只能转换为整数toString()
转换为字符串int.parse()
字符串转换为整数double.parse()
字符串转换为浮点数
dart
int age = 30;
String ageString = age.toString(); // '30'
String piString = '3.1415';
double pi = double.parse(piString); // 3.1415
其他
Runes
32 位字符对象 https://copychar.cc/Symbol
#开头的标识符 dynamic
动态类型
dart
var str = '✅';
str.length; // 2 UTF-16
str.units.length; // 1 UTF-32
Runes runes = new Runes('\u{1f680}');
new String.fromRunes(runes); // '🚀'
dart
var sym1 = #abc;
var sym2 = new Symbol('abc');
sym1 == sym2; // true
dart
dynamic a = 1;
a = '2';
a = true;
运算符
~/
整除 向下取整 is
is!
类型判断 ??
??=
避空 ?.
安全调用 ..
级联调用 返回调用对象
dart
// 整除
10 ~/ 3; // 3
// 类型判断
List list = [];
list is List; // true
list is! Number; // true
// 避空
11 ?? 12; // 11
null ?? 13; // 13
var a;
a ??= 3; // a=3
Set s1 = new Set();
s.add(1);
s.add(2);
s.add(3);
s.remove(2); // {1, 3}
Set s2 = new Set();
s2..add(1)
..add(2)
..add(3); // {1, 2, 3}