Dart语言核心知识梳理

2022-07-24 09:38:34

一、基本数据类型

1、Number

Dart数字有两种类型

1.1、int

不超过64位的整数,具体取决于平台。编译为JavaScript的Dart范围小。

int a=5;

1.2、double

64位(双精度)浮点型数字。由IEEE 754标准规定

double a = 5;
double b = 5.0;

2、String

String有较多的api,可以参考【Dart字符串处理】

3、bool

bool exist = true;

4、List

Dart中的数组,有序集合。

// List赋值
var fruits = ['apples', 'oranges'];
var list = <int>[1, 2, 3]; //[1, 2, 3]
var list1 = const <int>[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));

5、Set

Dart中的无序集合是Set

//Dart中的无序集合是Set
var set1 = {'a', 'b', 'c'};
// 指定类型
var set2 = <String>{};
// This works, too.
Set<String> set3 = {};
// var names = {}; // 注意:这种是map不是Set

set2.add('1');
set2.addAll(set1);//{1, a, b, c}
set2.length;//4

6、Map

键值对。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<int, String>();

// Map的赋值.中括号中是Key,这里可不是数组
map3[54] = 'dart';
//Map中的键值对是唯一的
//同Set不同,第二次输入的Key如果存在,Value会覆盖之前的数据
map3[54] = 'xenon';

// 检索Map是否含有某Key
map3.containsKey(54);
//删除某个键值对
map3.remove(54);

7、【印象】Runes

【表情符号】在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));
}

8、【印象】Symbol

Symbol对象表示Dart程序中声明的运算符或标识符。

9、Function

Dart是真面向对象的语言,所以即使是函数也是一个对象,类型为Function。这意味着函数可以分配给变量或者作为参数传递给其他函数。

9.1、可选参数

void test() {}

二、类型转换

1、String -> int

var one = int.parse('1');

2、String -> double

var onePointOne = double.parse('1.1');

3、int -> String

String oneAsString = 1.toString();

4、double -> String

注意括号中要有小数点位数,否则报错

String piAsString = 3.14159.toStringAsFixed(2);

三、Dart运算符

1、 ?. 空检查运算符

它的意思是左边如果为空返回 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;
}

2、 ?? 空检查运算符

空检查运算符。它的意思是左边如果为空返回右边的值,否则不处理。

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;
}

3、??= 赋值空检查运算符

??= 简单的说就是如果左侧为空,则执行赋值。并且当变量为空时,只会分配一个值。

void main() {
  String? name;
  name ??= '张三';
  name ??= '李四';
  name ??= '王五';
  print('name' + name.toString());//name张三
}

4、=> 箭头运算符

=>Dart 中称为粗箭头运算符。它有两种应用场景。一是 相当于{return x;} 的作用,二是作用于单条语句

// 1\. 相当于 `{return x;}` 的作用
String testFunction1(String text) => text.toLowerCase();
// 2\. 作用于单条语句
void testFunction2(String text) => print(text);

5、… 级联运算符

级联运算符更改对象属性(通常是在创建对象时)的一种简单方法,而不是获得对该对象的引用并逐个更改属性。

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() + '岁';
  }
}

6、~/ 求商算术运算符

算术运算符,〜/运算符除以并返回结果的底数(整数部分)。

void main() {
  int a = 7;
  int b = 3;
  print(a ~/ b);//2
}

7、… 拓展运算符

使用此运算符可以轻松解压缩列表

void main() {
  List aList = [1, 2];
  var bList = ['a', 'b'];
  print([...aList, 'asdf', ...bList]);//[1, 2, asdf, a, b]
}

8、is 运算符

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 {}

9、is!运算符

意义与上面相反

10、as 运算符

类型转换

void main() {
  User a = User();

  a.userName;
  (a as SuperUser).superUserName;
}

class User {
  get userName => 'userName';
}

class SuperUser extends User {
  get superUserName => 'superUserName';
}

11、! 断言运算符

声明变量非null

void printText(String? str) {
  print('' + str!);
}

四、字符串处理

这里主要记录dart与常规的高级语言不通之处,相同之处startsWith、endsWith、contains、replaceAll、indexOf、lastIndexOf等不做记录

1、多行字符串

使用三个单引号或三个双引号 创建多行字符串,保留内在格式,如换行和缩进等,里面写什么输出就是什么。

String text = '''asd
   fdsd
     fff
  
  ''';

2、使用r创建原始raw字符串

转义字符等特殊字符会输出出来,而不会自动被转义

String str1 = r'Hello \n  World';

3、字符串模板

使用${} 将一个字符串变量/表达式嵌入到另一个字符串内

void main() {
  String name = '张三';
  String text = '名字${name.toLowerCase()}';
  print(text); //名字张三
}

4、【印象】splitMapJoin方法

查询“,”,用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
}

5、replaceFirst方法

替换第一个

String a4 = "abcdeab";
print(a4.replaceFirst("ab", "dd"));//ddcdeab 只替换第一个符合条件的

6、replaceRange方法

指定范围替换

String a4 = "abcdeab";
// 范围替换 从0-3 含0不含3
print(a4.replaceRange(1, 3, "1"));//a1deab

7、【印象】replaceAllMapped方法

【有印象即可】用方法返回值替换指定的字符串

String a4 = "abcdeab";
print(a4.replaceAllMapped("c", (Match match){//abyydeab 用方法返回值替换指定的字符串
  return "yy";
}));

其中match参数如下图所示

image-20211222155858546

8、【印象】replaceFirstMapped方法

从index=2开始 用方法返回值替换指定的字符串

String a4 = "abcdeab";
print(a4.replaceFirstMapped("b", (Match match){//abcdea333 从index=2开始 用方法返回值替换指定的字符串
  return "333";
},2));

9、indexOf方法

indexOf支持从index=xx开始往后找

lastIndexOf支持从index=xx开始往前找

String a9 = "aababcc1bc23";
print(a9.indexOf("ab",2));//3 从index=2开始往后找

10、trim方法

a11.trim()//去除左右两边空格
a11.trimRight()//去除右边空格
a11.trimLeft()//去除左边空格

11、【印象】padLeft、padRight方法

补齐长度 剩余位使用指定字符串替换

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 如果指定长度小于原字符串长度 返回原字符串

12、compareTo方法

String a12 = "bbcc";
print(a12.compareTo("aaa"));//1 在ascii码中 b>a

13、【印象】codeUnits方法

返回给定字符串的UTF-16代码单元列表

String str = "Hello";
print(str.codeUnits);//[72, 101, 108, 108, 111]

14、【印象】codeUnitAt方法

返回给定索引处的16位UTF-16代码单元

String str = "Hello";
print(str.codeUnitAt(0));//72

15、==运算符

比较两个字符串是否相同。这里没有equals

16、[]取值运算符

取出字符串索引位指向的单个字符

String a = 'abc';
print(a[1]); //b

17、StringBuffer字符串变量

StringBuffer是可改变的,定义后还可以再修改

StringBuffer buffer = new StringBuffer();
buffer.write("a ");
buffer.write("b ");
print(buffer);
buffer.clear();
buffer.write("c ");
print(buffer);
  • 作者:流星雨在线
  • 原文链接:https://blog.csdn.net/liuxingyuzaixian/article/details/125636130
    更新时间:2022-07-24 09:38:34