Dart语法重点学习—语言特性与常用数据类型

语言特性

  • Dart所有的东西都是对象, 即使是数字numbers、函数function、null也都是对象,所有的对象都继承自Object类。
  • Dart动态类型语言, 尽量给变量定义一个类型,会更安全,没有显示定义类型的变量在 debug 模式下会类型会是 dynamic(动态的)。
  • Dart中的类和接口是统一的,类即接口,你可以继承一个类,也可以实现一个类(接口),自然也包含了良好的面向对象和并发编程的支持。
  • Dart 没有 public、private、protected 这些关键字,变量名以"_"开头意味着对它的 lib 是私有的。
  • 没有初始化的变量都会被赋予默认值 null。
  • final的值只能被设定一次。const 是一个编译时的常量,可以通过 const 来创建常量值,var c=const[];,这里 c 还是一个变量,只是被赋值了一个常量值,它还是可以赋其它值。实例变量可以是 final,但不能是 const
  • Dart 提供了顶级函数(如:main())。
关键字(56个)

更多关键字[[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rCXAbUr1-1613619793618)(/images/2/88/企业微信截图_20200708141828.png)]]

数据类型

1. num

num 是数字类型的父类,有两个子类 int【允许值从-253到253 - 1】 和 double【64位(双精度)浮点数,如IEEE 754标准所规定。】

 int a = 1;
 print(a);
 
 double b = 1.12;
 print(b);
 
 // String -> int
 int one = int.parse('1');
 // 输出3
 print(one + 2);
 
 // String -> double
 var onePointOne = double.parse('1.1');
 // 输出3.1
 print(onePointOne + 2);

 // int -> String
 String oneAsString = 1.toString();
 // The argument type 'int' can't be assigned to the parameter type 'String'
 //print(oneAsString + 2);
 // 输出 1 + 2
 print('$oneAsString + 2');
 // 输出 1 2
 print('$oneAsString 2');

 // double -> String 注意括号中要有小数点位数,否则报错
 String piAsString = 3.14159.toStringAsFixed(2);
 // 截取两位小数, 输出3.14
 print(piAsString);
 
 String aString = 1.12618.toStringAsFixed(2);
 // 检查是否四舍五入,输出1.13,发现会做四舍五入
 print(aString);
2. String
  • Dart里面的String是一系列 UTF-16 代码单元。
  • 您可以使用单引号或双引号来创建一个字符串。
  • 单引号或者双引号里面嵌套使用引号。
  • 来 计 算 字 符 串 中 变 量 的 值 , 需 要 注 意 的 是 如 果 是 表 达 式 需 要 来计算字符串中变量的值,需要注意的是如果是表达式需要 {表达式}

String singleString = ‘aaa’;
String doubleString = “bbb”;
// 单引号嵌套双引号
String sdString = ‘$singleString a “bbb” ${doubleString}’;
// 输出 aaa a “bbb” bbb
print(sdString);

 // 双引号嵌套单引号
 String dsString = "${singleString.toUpperCase()} abc 'aaa' $doubleString.toUpperCase()";
 // 输出 AAA abc 'aaa' bbb.toUpperCase(), 
 可以看出 ”$doubleString.toUpperCase()“ 没有加“{}“,导致输出结果是”bbb.toUpperCase()“
 print(dsString);

字符串常用属性

String a21 = "";
print(a20.length);//4  字符串长度
print(a20.isEmpty);//false    是否为空
print(a20.isNotEmpty);//true   是否不为空

字符串判断 是否包含或以xxx开始结束等

    String a3 = "aaabbbccc";
    print(a3.startsWith("aa")); //true
    print(a3.startsWith("aa", 3)); //false  从index=3开始判断
    print(a3.endsWith("c")); //true
    print(a3.contains("ab")); //true
    print(a3.contains("ac")); //false
    print(a3.contains("ab", 3)); //false  从index=3开始判断

字符串替换

    String a4 = "abcdeab";
    print(a4.replaceAll("ab","cc"));//cccdecc  替换全部符合条件的
    print(a4.replaceFirst("ab", "dd"));//ddcdeab  只替换第一个符合条件的
    print(a4.replaceFirst("ab", "dd",3));//abcdedd  从index=3开始  替换第一个符合条件的
    print(a4.replaceRange(1, 3, "z"));// 范围替换 从0-3  含0不含3
    print(a4.replaceAllMapped("c", (Match match){//abyydeab  用方法返回值替换指定的字符串
      return "yy";
    }));
    print(a4.replaceFirstMapped("b", (Match match){//abcdea333  从index=2开始 用方法返回值替换指定的字符串
      return "333";
    },2));

字符串查找

	String a9 = "aababcc1bc23";
    print(a9.indexOf("ab"));//1  第一个符合条件的index
    print(a9.indexOf("ab",2));//3   从index=2开始往后找
    print(a9.indexOf("ab",4));//-1   从index=4开始往后找,找不到返回-1
    print(a9.lastIndexOf("bc"));//8  从后往前找   返回第一个符合条件的index
    print(a9.lastIndexOf("bc",3));//-1  从后往前找  从index=3结束找  返回第一个符合条件的index  找不到返回-1
    print(a9.lastIndexOf("bc",7));//4  从后往前找  从index=7结束找  返回第一个符合条件的index

字符串切割

    String a2 = "aaabbb";
    print(a2.substring(0, 2)); //aa   含头不含尾
    print(a2.substring(3)); //bbb  从指定index至末尾
    String a5 = "a,d,d  d,c,,";
    List<String> a6 = a5.split(",");//使用,分割,返回的是一个数组
    print(a6.length); //6
    print(a6); //[a, d, d  d, c, , ]

    String a8 = "a b,c";
    String a7 = a8.splitMapJoin(",",//查询“,”,用onMatch的返回值替换“,”用onNonMatch的返回值替换其他
        onMatch: (Match match) {
          return "a";
        }, onNonMatch: (String nonMatch) {
          return "b";
        });
    print(a7);//bab    a b,c  =>   bab
3. bool
  • Dart 是强 bool 类型检查,只有bool 类型的值是true 才被认为是true。

  • 只有两个对象具有bool类型:true和false,它们都是编译时常量。

  • Dart的类型安全意味着您不能使用 if(nonbooleanValue) 或 assert(nonbooleanValue) 等代码, 相反Dart使用的是显式的检查值。

  • assert 是语言内置的断言函数,仅在检查模式下有效
    在开发过程中, 除非条件为真,否则会引发异常。(断言失败则程序立刻终止)。

    // 检查是否为空字符串
    var fullName = '';
    assert(fullName.isEmpty);
    
    // 检查0
    var hitPoints = 0;
    assert(hitPoints <= 0);
    
    // 检查是否为null
    var unicorn;
    assert(unicorn == null);
    
    // 检查是否为NaN
    var iMeantToDoThis = 0 / 0;
    assert(iMeantToDoThis.isNaN);
    
4.List集合
  • 在Dart中,数组是List对象,因此大多数人只是将它们称为List。
    Dart list文字看起来像JavaScript数组文字

//创建一个int类型的list
List list = [10, 7, 23];
// 输出[10, 7, 23]
print(list);

 // 使用List的构造函数,也可以添加int参数,表示List固定长度,不能进行添加 删除操作
 var fruits = new List();
 
 // 添加元素
 fruits.add('apples');
 
 // 添加多个元素
 fruits.addAll(['oranges', 'bananas']);
 
 List subFruits = ['apples', 'oranges', 'banans'];
 // 添加多个元素
 fruits.addAll(subFruits);
 
 // 输出: [apples, oranges, bananas, apples, oranges, banans]
 print(fruits);
 
 // 获取List的长度
 print(fruits.length);
 
 // 获取第一个元素
 print(fruits.first);
 
 // 获取元素最后一个元素
 print(fruits.last);
 
 // 利用索引获取元素
 print(fruits[0]);
 
 // 查找某个元素的索引号
 print(fruits.indexOf('apples'));
 
 // 删除指定位置的元素,返回删除的元素
 print(fruits.removeAt(0));

 // 删除指定元素,成功返回true,失败返回false
 // 如果集合里面有多个“apples”, 只会删除集合中第一个改元素
 fruits.remove('apples');

 // 删除最后一个元素,返回删除的元素
 fruits.removeLast();

 // 删除指定范围(索引)元素,含头不含尾
 fruits.removeRange(start,end);

 // 删除指定条件的元素(这里是元素长度大于6)
 fruits.removeWhere((item) => item.length >6);

 // 删除所有的元素
 fruits.clear();
  • 注意事项:

  • 可以直接打印list包括list的元素,list也是一个对象。但是java必须遍历才能打印list,直接打印是地址值。

  • 和java一样list里面的元素必须保持类型一致,不一致就会报错。

  • 和java一样list的角标从0开始。

  • 如果集合里面有多个相同的元素“X”, 只会删除集合中第一个改元素

    • 常用方法:

add(值) 往末尾增加值
addAll(list) 拼接数组
insert(index,value) 指定位置插入
insertAll(index,list) 指定位置插入List
followedBy(list) 将自身和参数内list合成一个新的伪数组
remove(value) 删除 传入具体值
removeAt(index) 删除 传入索引值
removeLast() 删除末尾元素
removeRange(start,end) 范围删除元素,含头不含尾部
removeWhere(fn) 根据条件删除
clear() 清空数组
setRange(start,end,list) 范围修改list值,含头不含尾
replaceRange(start,end,list) 范围内替换list值,含头不含尾
fillRange(start,end,value) 范围内用value值替换
retainWhere(fn) 各级条件筛选元素,原数组会改变
setAll(start,list) //从start开始,使用list内的元素逐个替换数组里的元素
indexOf(value) 查找数组的索引 传入具体值
lastIndexOf(value) 从后往前查找,传入具体值,还是返回正常的索引
elementAt(index) //获取索引位置的值
any(fn) 判断list中是否有任意一个元素符合给定的参数,有任意一个满足添加的话返回true,否则是false
every(fn) 判断listz中每一项是否都满足条件,全部满足的话才返回true,否则是false
contains(value) list中是否存在value值
firstWhere(fn) 返回第一个满足条件的元素值
indexWhere(fn) 返回第一个满足条件的索引
lastWhere(fn) 从后往前找,返回第一个满足添加的元素值
forEach(fn) 正常遍历数组
map(fn) 遍历并做处理,返回新的伪数组
toList() 其他类型转换成List
join() List转换成字符串
split() 字符串转化成List

    ...
5.Map集合
  • 一般来说,map是将键和值相关联的对象。键和值都可以是任何类型的对象。
    每个键只出现一次,但您可以多次使用相同的值。Dart支持map由map文字和map类型提供。

  • 初始化Map方式一: 直接声明,用{}表示,里面写key和value,每组键值对中间用逗号隔开。

 // Two keys in a map literal can't be equal.
 // Map companys = {'Alibaba': '阿里巴巴', 'Tencent': '腾讯', 'baidu': '百度', 'Alibaba': '钉钉', 'Tenect': 'qq-music'};
 
 Map companys = {'Alibaba': '阿里巴巴', 'Tencent': '腾讯', 'baidu': '百度'};
 // 输出:{Alibaba: 阿里巴巴, Tencent: 腾讯, baidu: 百度}
 print(companys);
  • 创建Map方式二:先声明,再去赋值。

Map schoolsMap = new Map();
schoolsMap[‘first’] = ‘清华’;
schoolsMap[‘second’] = ‘北大’;
schoolsMap[‘third’] = ‘复旦’;
// 打印结果 {first: 清华, second: 北大, third: 复旦}
print(schoolsMap);

 var fruits = new Map();
 fruits["first"] = "apple";
 fruits["second"] = "banana";
 fruits["fifth"] = "orange";
 //换成双引号,换成var 打印结果 {first: apple, second: banana, fifth: orange}
 print(fruits);
  • Map API

// 指定键值对的参数类型
var aMap = new Map<int, String>();

// Map的赋值,中括号中是Key,这里可不是数组
aMap[1] = '小米';

//Map中的键值对是唯一的
//同Set不同,第二次输入的Key如果存在,Value会覆盖之前的数据
aMap[1] = 'alibaba';

// map里面的value可以相同
aMap[2] = 'alibaba';

// map里面value可以为空字符串
aMap[3] = '';

// map里面的value可以为null
aMap[4] = null;

print(aMap);

// 检索Map是否含有某Key
assert(aMap.containsKey(1));

//删除某个键值对
aMap.remove(1); 

print(aMap);
  • 注意事项
  1. map的key类型不一致也不会报错。

  2. 添加元素的时候,会按照你添加元素的顺序逐个加入到map里面,哪怕你的key,比如分别是 1,2,4,看起来有间隔,事实上添加到map的时候是{1:value,2:value,4:value} 这种形式。

  3. map里面的key不能相同。但是value可以相同,value可以为空字符串或者为null。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值