Dart数字有两种类型
不超过64位的整数,具体取决于平台。编译为JavaScript的Dart范围小。
int a=5;
64位(双精度)浮点型数字。由IEEE 754标准规定
double a = 5;
double b = 5.0;
String有较多的api,可以参考【Dart字符串处理】
bool exist = true;
Dart中的数组,有序集合。
// List赋值
var fruits = ['apples', 'oranges'];
var list = [1, 2, 3]; //[1, 2, 3]
var list1 = const [1, 2, 3]; //const修复的List不可修改
var list2 = List.filled(3, 0); //[0, 0, 0]
var list3 = List.generate(3, (i) => i); //[0, 1, 2]
// 添加元素
fruits.add('kiwis');
// 添加多个元素
fruits.addAll(['grapes', 'bananas']);
// 获取第一个元素
fruits.first;
// 获取元素最后一个元素
fruits.last;
// 查找某个元素的索引号
assert(fruits.indexOf('apples') == 0);
// 删除指定位置的元素,返回删除的元素
fruits.removeAt(index);
// 删除指定元素,成功返回true,失败返回false
fruits.remove('apples');
// 删除最后一个元素,返回删除的元素
fruits.removeLast();
// 删除指定范围元素,含头不含尾,成功返回null
fruits.removeRange(start,end);
// 删除指定条件的元素,成功返回null
fruits.removeWhere((item) => item.length >6);
// 删除所有的元素
fruits.clear();
// sort()对元素进行排序,传入一个函数作为参数,return <0表示由小到大, >0表示由大到小
fruits.sort((a, b) => a.compareTo(b));
Dart中的无序集合是Set
//Dart中的无序集合是Set
var set1 = {'a', 'b', 'c'};
// 指定类型
var set2 = {};
// This works, too.
Set set3 = {};
// var names = {}; // 注意:这种是map不是Set
set2.add('1');
set2.addAll(set1);//{1, a, b, c}
set2.length;//4
键值对。key和value都可以是任意类型的对象,key只能出现一次,value可以出现多次。
// Map的声明一
var map1 = {
'oahu': ['waikiki', 'kailua', 'waimanalo'],
'big island': ['wailea bay', 'pololu beach'],
'kauai': ['hanalei', 'poipu']
};
// Map的声明二
var map2 = new Map();
/**
* Map的声明三
* 指定键值对的参数类型
*/
var map3 = new Map();
// Map的赋值.中括号中是Key,这里可不是数组
map3[54] = 'dart';
//Map中的键值对是唯一的
//同Set不同,第二次输入的Key如果存在,Value会覆盖之前的数据
map3[54] = 'xenon';
// 检索Map是否含有某Key
map3.containsKey(54);
//删除某个键值对
map3.remove(54);
【表情符号】在Dart中,Runes是字符串的UTF-32代码点。
main() {
var clapping = '\u{1f44f}';
print(clapping);
print(clapping.codeUnits);
print(clapping.runes.toList());
Runes input = new Runes(
'\u2665 \u{1f605} \u{1f60e} \u{1f47b} \u{1f596} \u{1f44d}');
print(new String.fromCharCodes(input));
}
Symbol对象表示Dart程序中声明的运算符或标识符。
Dart是真面向对象的语言,所以即使是函数也是一个对象,类型为Function。这意味着函数可以分配给变量或者作为参数传递给其他函数。
void test() {}
var one = int.parse('1');
var onePointOne = double.parse('1.1');
String oneAsString = 1.toString();
注意括号中要有小数点位数,否则报错
String piAsString = 3.14159.toStringAsFixed(2);
它的意思是左边如果为空返回 null,否则返回右边的值。
A?.B
如果 A 等于 null,那么 A?.B 为 null
如果 A 不等于 null,那么 A?.B 等价于 A.B
void main() {
User? userA;
User? userB = User();
print(userA?.name);//null
print(userB.name);//name字段
}
class User {
String _name = 'name字段';
get name => _name;
}
空检查运算符。它的意思是左边如果为空返回右边的值,否则不处理。
A??B
如果 A 等于 null,那么 A??B 为 B
如果 A 不等于 null,那么 A??B 为 A
void main() {
User? userA;
User? userB = User();
print((userA ?? userB).name);//name字段
print((userB).name);//name字段
}
class User {
String _name = 'name字段';
get name => _name;
}
??=
简单的说就是如果左侧为空,则执行赋值。并且当变量为空时,只会分配一个值。
void main() {
String? name;
name ??= '张三';
name ??= '李四';
name ??= '王五';
print('name' + name.toString());//name张三
}
=>
在Dart
中称为粗箭头运算符。它有两种应用场景。一是 相当于{return x;}
的作用,二是作用于单条语句
// 1\. 相当于 `{return x;}` 的作用
String testFunction1(String text) => text.toLowerCase();
// 2\. 作用于单条语句
void testFunction2(String text) => print(text);
级联运算符更改对象属性(通常是在创建对象时)的一种简单方法,而不是获得对该对象的引用并逐个更改属性。
void main() {
User user = User()
..name = '张三'
..age = 15;
print(user.toString());//张三15岁
}
class User {
String name = '';
int age = 0;
@override
String toString() {
return name + age.toString() + '岁';
}
}
算术运算符,
〜/
运算符除以并返回结果的底数(整数部分)。
void main() {
int a = 7;
int b = 3;
print(a ~/ b);//2
}
使用此运算符可以轻松解压缩列表
void main() {
List aList = [1, 2];
var bList = ['a', 'b'];
print([...aList, 'asdf', ...bList]);//[1, 2, asdf, a, b]
}
a is b,用于判断 a 对象是否是 b 类的实例,返回 bool 值
void main() {
User a = User();
SuperUser b = SuperUser();
User c = SuperUser();
print(a is User); //true
print(b is SuperUser); //true
print(c is SuperUser); //true
}
class User {}
class SuperUser extends User {}
意义与上面相反
类型转换
void main() {
User a = User();
a.userName;
(a as SuperUser).superUserName;
}
class User {
get userName => 'userName';
}
class SuperUser extends User {
get superUserName => 'superUserName';
}
声明变量非null
void printText(String? str) {
print('' + str!);
}
这里主要记录dart与常规的高级语言不通之处,相同之处startsWith、endsWith、contains、replaceAll、indexOf、lastIndexOf等不做记录
使用三个单引号或三个双引号 创建多行字符串,保留内在格式,如换行和缩进等,里面写什么输出就是什么。
String text = '''asd
fdsd
fff
''';
转义字符等特殊字符会输出出来,而不会自动被转义
String str1 = r'Hello \n World';
使用${} 将一个字符串变量/表达式嵌入到另一个字符串内
void main() {
String name = '张三';
String text = '名字${name.toLowerCase()}';
print(text); //名字张三
}
查询“,”,用onMatch的返回值替换“,”用onNonMatch的返回值替换其他
void main() {
String a8 = "a b,c";
String a7 = a8.splitMapJoin(",",
onMatch: (Match match) {
return "1";
}, onNonMatch: (String nonMatch) {
return "2";
});
print(a7); //212 a b,c => 212
}
替换第一个
String a4 = "abcdeab";
print(a4.replaceFirst("ab", "dd"));//ddcdeab 只替换第一个符合条件的
指定范围替换
String a4 = "abcdeab";
// 范围替换 从0-3 含0不含3
print(a4.replaceRange(1, 3, "1"));//a1deab
【有印象即可】用方法返回值替换指定的字符串
String a4 = "abcdeab";
print(a4.replaceAllMapped("c", (Match match){//abyydeab 用方法返回值替换指定的字符串
return "yy";
}));
其中match参数如下图所示
从index=2开始 用方法返回值替换指定的字符串
String a4 = "abcdeab";
print(a4.replaceFirstMapped("b", (Match match){//abcdea333 从index=2开始 用方法返回值替换指定的字符串
return "333";
},2));
indexOf支持从index=xx开始往后找
lastIndexOf支持从index=xx开始往前找
String a9 = "aababcc1bc23";
print(a9.indexOf("ab",2));//3 从index=2开始往后找
a11.trim()//去除左右两边空格
a11.trimRight()//去除右边空格
a11.trimLeft()//去除左边空格
补齐长度 剩余位使用指定字符串替换
String a13 = "111";
print(a13.padLeft(6));// 111 剩余3个位 默认使用""补齐
print(a13.padRight(6,"c")); //111ccc 剩余3个位 指定使用"c"
print(a13.padRight(6,"dd")); //111dddddd 剩余3个位 每个位指定使用"dd" 替换后总长度不是6
print(a13.padLeft(2,"e"));//111 如果指定长度小于原字符串长度 返回原字符串
String a12 = "bbcc";
print(a12.compareTo("aaa"));//1 在ascii码中 b>a
返回给定字符串的UTF-16代码单元列表
String str = "Hello";
print(str.codeUnits);//[72, 101, 108, 108, 111]
返回给定索引处的16位UTF-16代码单元
String str = "Hello";
print(str.codeUnitAt(0));//72
比较两个字符串是否相同。这里没有equals
取出字符串索引位指向的单个字符
String a = 'abc';
print(a[1]); //b
StringBuffer是可改变的,定义后还可以再修改
StringBuffer buffer = new StringBuffer();
buffer.write("a ");
buffer.write("b ");
print(buffer);
buffer.clear();
buffer.write("c ");
print(buffer);