美文网首页
Dart初识:数据类型、运算符、条件表达式等

Dart初识:数据类型、运算符、条件表达式等

作者: 见字如晤一 | 来源:发表于2022-02-09 17:05 被阅读0次

    Dart介绍:

    Dart是由谷歌开发的计算机编程语言,它可以被用于web、服务器、移动应用 和物联网等领域的开发。
    Dart诞生于2011年,号称要取代JavaScript。但是过去的几年中一直不温不火。直到Flutter的出现现在被人们重新重视。

    要学Flutter的话我们必须首先得会Dart。

    官网:https://dart.dev/
    

    Dart环境搭建:

    要在我们本地开发Dart程序的话首先需要安装Dart Sdk
    官方文档:https://dart.dev/get-dart

      windows(推荐):
      http://www.gekorm.com/dart-windows/
    
      mac:
      如果mac电脑没有安装brew这个工具首先第一步需要安装它:  https://brew.sh/
      brew tap dart-lang/dart
      brew install dart
    

    Dart 开发工具:

      Dart的开发工具有很多: IntelliJ IDEA  、 WebStorm、 Atom、Vscode等
    

    语法:入口、注释、变量、常量命名规则

    入口方法的两种定义方式:

    main(){
        print('你好dart');
      }
    
    void main(){
     print('你好dart');
    }
    
    void 代表无返回值,有点像java程序的入口
    

    注释有

    /*
    注释
    */
    

    /// 或者 //
    

    Dart 变量:dart是一个强大的脚本类语言,可以不预先定义变量类型 ,自动会类型推倒
    dart中定义变量可以通过var关键字可以通过类型来申明变量
    如:

    var str='this is var';
    String str='this is var';
    int str=123;
    

    注意: var 后就不要写类型 , 写了类型 不要var 两者都写 var a int = 5; 报错

    Dart 常量: final 和 const修饰符
    const值不变 一开始就得赋值
    final 可以开始不赋值 只能赋一次 ; 而final不仅有const的编译时常量的特性,最重要的它是运行时常量,并且final是惰性初始化,即在运行时第一次使用前才初始化
    永远不改量的量,请使用final或const修饰它,而不是使用var或其他变量类型。

    final name = 'Bob'; // Without a type annotation
    final String nickname = 'Bobby';
    
    const bar = 1000000; // Unit of pressure (dynes/cm2)
    const double atm = 1.01325 * bar; // Standard atmosphere
    

    Dart的命名规则:

    1、变量名称必须由数字、字母、下划线和美元符($)组成。
    2.注意:标识符开头不能是数字
    3.标识符不能是保留字和关键字。   
    4.变量的名字是区分大小写的如: age和Age是不同的变量。在实际的运用中,也建议,不要用一个单词大小写区分两个变量。
    5、标识符(变量名称)一定要见名思意 :变量名称建议用名词,方法名称建议用动词 
    

    Dart的数据类型

    与java对比,Dart没有那么丰富的数据类型
    常用的数据类型有:
    1、数值类型:int、double (没有flout、short等)
    2、字符类型:String(没有char类型)
    3、布尔类型:bool(和java中的boolean区别,bool只接收true/false,不能像java中的布尔类型一样接受0和其他整型)
    4、List(数组/集合)在Dart中,数组是列表对象,所以大多数人只是称它们为列表
    5、Maps(字典)通常来说,Map 是一个键值对相关的对象。 键和值可以是任何类型的对象。每个键只出现一次, 而一个值则可以出现多次

    1、数值类型

      /***
       * int 测试
       */
      var i1 = 123;
      //i1 = 123.00;//会报错,i1被自动定义成了int类型,再给它赋值double类型是不行的
      print(i1);
    
      var i2 = 123.00;
      i2 = 111;//i2被自动定义成double类型,后赋值111时,i2还是double类型,所以打印出来的数值是111.0
      print(i2);
    

    2、字符类型

    /**
       * 字符串测试
       */
      String str1 = "this is str1";
      String str2 ='this is str2';
    //三个单引号或三个双引号括起来的字符串,会保持原有样式换行输出,这个是同单个双引号或单引号相比的区别
      String str3 ='''this is str3
      this is str3
      this is str3
      ''';
      
      String str4=""" this is str4   this is str4
      this is str4
      """;
      print(str1);
      print(str2);
      print(str3);
      print(str4);
    

    3、布尔类型bool

    /**
       * 布尔类型测试
       */
      bool f1 = true;
      bool f2 = false;
      // f1 = 0;//报错,bool类型不能被int赋值
      // f2 = 123;//报错,bool类型不能被int赋值
      if(f1 is String){
        print("f1 is String");
      }else if(f1 is bool){
        print("f1 is bool");
      }else{
        print("is other");
      }
    

    4、List集合(列表/数组)

    /**
       * List数组/列表测试
       */
      var a = ["aaa", "bbb", 110];
      List b = [];
      // List c = new List();//这种声明方式是错误的,声明一样新的空列表,要使用List c = []
      b.add("aaa");
      b.add("bbb");
      b.add(110);
      print(a);
      print(b);
    

    5、Map字典

    /**
       * Map字典测试
       */
      //直接赋值,采用json的格式,取其中具体key的值时用map["xxx"]方式
      Map map = {
        "name": "jack",
        "age": 12,
        "work": ["安卓开发", "java后台", "架构师"]
      };
      print(map);
      print(map["name"]);
      //第二种定义方式,同第一种直接赋值方式得到的结果相同
      var map1 = new Map();
      map1["name"] = "xuqingsong";
      map1["age"] = 31;
      map1["work"] = ["安卓开发", "java后台", "架构师"];
    
      print(map1);
    

    Dart判断数据类型:is 关键词来判断类型

    Dart运算符

    算术运算符

    +    -    *    /     ~/ (取整)     %(取余)
    

    测试代码如下:

      /**
       * 运算符测试
       */
      int a = 13;
      int b = 5;
      print(a+b);//加
      print(a-b);//减
      print(a*b);//乘
      print(a/b);//除
      print(a~/b);//取整
      print(a%b);//取余
    
    结果值:
    18
    8
    65
    2.6
    2
    3
    

    值得注意的时,这里除数和被除数都是int类型,但是除法得到的结果值是小数,不会像java一样结果值类型由除数或被除数限定为int类型

    关系运算符

    ==    !=   >    <    >=    <=
    

    关系运算符用在条件判断里,同其他语言是一样的,这里就不进行代码示范了。

    逻辑运算符

     !            &&         ||
    
    取反          并且          或者
    

    逻辑运算符的意义同其他语音如java一致,这里不再赘述

    赋值运算符

    基础赋值运算符   =   ??=
    复合赋值运算符   +=  -=  *=   /=   %=  ~/=
    

    复合赋值运算符同java中一致(+= 、 -=、 *= 、 /= 、 %= 、 ~/=,==),其中??=代表的意思是,当值为空时,复制等号后面的值。如:

    /**
       * 赋值运算
       *
       */
      var a;
      var b = a ??= "10";
      print("b = " + b);
    
    结果是
    b = 10
    
    
    
     var c = "12";
     var d = c ??= "20";
     print("d = " + d);
    
    结果是
    
    main.dart:99:11: Warning: Operand of null-aware operation '??=' has type 'String' which excludes null.
      var d = c ??= "20";
              ^
    d = 12
    
    感觉这个赋值运算有问题,居然报出警告,但是又给到了正确值,注意这里的变量类型必须是可空的字符串,
    int类型是会报错的。
    看visual studio演示是int是可以的
    

    条件表达式

    if  else   switch case 
    

    这里要说明一下的是,switch同java8相似,case支持是字符串类型。

    /**
       * if else switch case 演示
       */
      var a = "男";
      var b = "女";
      
      if(a == "男"){
        print("a 是 男");
      }else{
        print("a 不是 男");
      }
    
      var c;
      switch(b){
        case "男":
          print("switch is 男");
          break;
    
        case "女":
          print("switch is 女");
          break;
    
        default:
          print("switch is default");
          break;
      }
      switch(c){
        case "男":
          print("switch is 男");
          break;
    
        case "女":
          print("switch is 女");
          break;
    
        default:
          print("switch is default");
          break;
      }
    
    
    结果值:
    
    a 是 男
    switch is 女
    switch is default
    

    三目运算符

    表达式 ? 为true时的赋值 :为false时的赋值
    

    示例如下:

    /**
       * 三目运算符测试 ?? xxx:yyy
       */
     String a ="";
     print("a =" + a);
     String b = a == "" ? 'xxx' : 'yyy';
     print(b);
    
    结果是
    a =
    xxx
    
    a首先赋值为空字符串,所以打印出来是空字符串,然后判断为true时赋值为“xxx”
    

    类型转换

     /**
       * Sting类型和int类型互转:
       * int 转 String 用toString
       * String 转 int 用parse
       */
      String a = "123";
      int b = int.parse(a);
      print(b);
      print(b is int);
    
      int c = 110;
      print(c.toString());
    
    结果值:
    
    123
    true
    110
    

    类型转换时,数值转换建议用double代替int,这样可以规避很多问题。
    其次String转成具体数值如double类型时,注意字符串为空的时候的异常问题

    /**
       * Sting类型和int类型互转:
       * int 转 String 用toString
       * String 转 int 用parse
       */
      String c = "";
      try {
        double d = double.parse(c);
        print(d);
      } catch (err) {
        print(err);
      }
    
    结果值:
    FormatException: Invalid double
    
    记得try/catch
    

    其他类型转为bool类型

    /**
       * 其他类型转换成bool类型,主要是依靠==来组成判断表达式
       */
      var a;
      if(a == null){//此处a类型无法推导出,不能用a.isEmpty方法。NoSuchMethodError: The getter 'isEmpty' was called on null.
        print("a 空");
      }else{
        print("非空");
      }
    
      String b = "";//此处b被使用,必须赋值,只声明不赋值会报错
      if(b.isEmpty){
        print("b isEmpty");
      }else{
        print("非 isEmpty");
      }
    
      int c = 0;//此处的c在使用时必须赋值,只声明不赋值会报错
      if(c == 0){
        print("c == 0");
      }else{
        print("c 非 0");
      }
    

    特殊值NaN

    
      /**
       * 特殊值NaN,使用方法isNaN进行判断
       */
      var a = 0/0;//0不能作为除数,此时并不会抛异常,a会被赋值成NaN
      if(a.isNaN){
        print("a isNaN");
      }else{
        print("a != NaN");
      }
    
    结果是:
    
    a isNaN
    

    自加自减:++ --

     /*
         ++  --   表示自增 自减 1
        在赋值运算里面 如果++ -- 写在前面 这时候先运算 再赋值,如果++ --写在后面 先赋值后运行运算
      */
     var a=10;
     var b=a--;
    
     print(a);  //9
     print(b);  //10
    
    var a=10;
     var b=--a;
    
     print(a);  //9
     print(b);  //9
    

    for循环

    /*
    
    // for基本语法
                //第一步,声明变量int i = 1;
                //第二步,判断i <=100
                //第三步,print(i);
                //第四步,i++
                //第五步 从第二步再来,直到判断为false
    */
     for (int i = 1; i<=10; i++) {   
                print(i);
              }
    
    结果值:只打印打1到10
    

    while/do while

    while(表达式/循环条件){            
                
            }
    
    
    do{
        语句/循环体
                
    }while(表达式/循环条件);
            
                    
    注意: 1、最后的分号不要忘记
    2、循环条件中使用的变量需要经过初始化
    3、循环体中,应有结束循环的条件,否则会造成死循环。
    

    break和continue的区别

    break语句功能:
    1、在switch语句中使流程跳出switch结构。
    2、在循环语句中使流程跳出当前循环,遇到break 循环终止,后面代码也不会执行
              
    强调:
    1、如果在循环中已经执行了break语句,就不会执行循环体中位于break后的语句。
    2、在多层循环中,一个break语句只能向外跳出一层
    
    break可以用在switch case中 也可以用在 for 循环和 while循环中
    
    continue语句的功能:
                  
    【注】只能在循环语句中使用,使本次循环结束,即跳过循环体重下面尚未执行的语句,接着进行下次的是否执行循环的判断。
    continue可以用在for循环以及 while循环中,但是不建议用在while循环中,不小心容易死循环
    */
    

    List操作

    /**
       * 演示List方法
       *
       * 属性方法:
       * .length
       * .isNotEmpty
       * .isEmpty
       *
       * 操作方法:
       * .reversed
       * .first
       * .last
       * .join()
       * .add()
       * .addAll()
       * .insert()
       * .insertAll()
       * .split()
       */
      List list = ["xxx", "yyy", "zzz"];
      print(list.length);
      if (list.isNotEmpty) {
        print("list isNotEmpty");
      } else if (list.isEmpty) {
        print("list isEmpty");
      }
      //其他方式
      print(list.reversed);
      print(list.first);
      print(list.last);
    
      print(list.join("/")); //转成字符串
      list.add("xuqingsong");
      list.addAll(["mm","nn"]);
      list.insert(1, "insert");
      list.insertAll(2, ["111","222"]);
      print(list.join("/").split("/")); //字符串格式转成list模式
    
    打印结果:
    3
    list isNotEmpty
    (zzz, yyy, xxx)
    xxx
    zzz
    xxx/yyy/zzz
    [xxx, insert, 111, 222, yyy, zzz, xuqingsong, mm, nn]
    
    

    Set集合

    /**
       * Set集合测试,同List对比,Set集合不能添加相同的数据,自动去重
       */
      var set = new Set();
      set.add("香蕉");
      set.add("苹果");
      print(set);//打印结果:{香蕉, 苹果}
      set.add("香蕉");//打印结果中无重复的香蕉,被自动去重了
      set.add("菠萝");
      print(set);//打印结果:{香蕉, 苹果, 菠萝}
    
      Set set1 = {"小狗","小猫"};
      print(set1);
      //声明list列表,然后通过addAll实现添加到Set中,addAll接收的参数是迭代器Iterable
      List list = ["熊猫","骆驼","小狗"];//结果集合中,小狗被过滤掉了
      set1.addAll(list);
      print(set1);
    
    打印的结果值:
    
    {香蕉, 苹果}
    {香蕉, 苹果, 菠萝}
    {小狗, 小猫}
    {小狗, 小猫, 熊猫, 骆驼}
    

    Map映射是无序的键值对
    映射(Maps)是无序的键值对:

    常用属性:
        keys            获取所有的key值
        values          获取所有的value值
        isEmpty         是否为空
        isNotEmpty      是否不为空
    常用方法:
        remove(key)     删除指定key的数据
        addAll({...})   合并映射  给映射内增加属性
        containsValue   查看映射内的值  返回true/false
        forEach   
        map
        where
        any
        every
    
     /**
       * Map测试:声明方式通集合set相似,
       * 由花括号括起来,只是里面的数据采用键值对的方式。
       * js中键可以没有单引号或双引号,但是dart中必须有,通java一样。
       */
      Map map = {
        "name": "xqs",
        "age": 19,
        "work": ["工程师", "设计师", "党员"]
      };
      print(map.keys.toList()); //将key值作为list输出
      print(map.values.toList()); //将value值作为list列表输出
      map.remove("xxx"); //这里会移除掉name的键值对
      print(map.keys.toList());
    
    结果值:
    
    [name, age, work]
    [xqs, 19, [工程师, 设计师, 党员]]
    [name, age, work]
    

    集合的遍历:for/.forEach

    Map map = {
        "name": "xqs",
        "age": 19,
        "work": ["工程师", "设计师", "党员"]
      };
      print("------分割线-------");
      //循环遍历方式1
      map.forEach((key, value) {
        print("$key----$value");
      });
      // for(int i=0;i<map.length;i++){//这种方式是无法取出值的
      //   print(map[i].toString());
      // }
      print("------分割线1-------");
      //循环遍历方式2
      List list = ["香蕉", "苹果", "榴莲"];
      for (var element in list) {
        //for(var x in y)这种方式不能用在map上,只能用在list和set上
        print(element + " >>>>  ");
      }
    
      for (int i = 0; i < list.length; i++) {
        print(list[i]+"!!!");
      }
    
      print("------分割2-------");
      Set mySet = {"香蕉", "苹果", "榴莲"};
      for (var element in mySet) {
        //for(var x in y)这种方式不能用在map上,只能用在list和set上
        print(element + "------");
      }
    
    结果值:
    ------分割线-------
    name----xqs
    age----19
    work----[工程师, 设计师, 党员]
    ------分割线1-------
    香蕉 >>>>  
    苹果 >>>>  
    榴莲 >>>>  
    香蕉!!!
    苹果!!!
    榴莲!!!
    ------分割2-------
    香蕉------
    苹果------
    榴莲------
    

    集合的遍历(可以用在list列表、map键值对、set集合上):map、where、any、every
    map是循环变量出每一个value进行表达式运算后返回对应的list集合

    where代表筛选出满足条件的value值

    any代表list列表集合中有一个value值满足表达式则返回true,否则返回false。any遍历到满足条件的value值后不会再继续变量

    every 代表list列表结婚中每一个value值都满足表达式筛选时返回true,否则返回false。
    every会遍历完所有的列表值

    /**
       * List 的map方法,循环遍历
       */
      List list = [1, 3, 4];
      // var newList = list.map((value) {
      //   return (value * 2);
      // });
      //等价于上面的表达式:map代表的是遍历取出value,然后返回对应的表达式
      var newList = list.map((value) => value * 2);
      print(newList);
    
      //where 代表每一个value满足这个表达式条件的筛选集合
      newList = list.where((value) => value < 4);
      print(newList.toList());
      //any方法,代表集合里有个满足条件就返回true
      bool flag = list.any((value) => value < 1);
      print(flag);
      //every方法代表集合中每一个值都满足条件,就返回true,否则返回false
      bool flag1 = list.every((value) => value < 5);
      print(flag1);
    
    /**
       * List 的map方法,循环遍历
       */
      List list = [1, 3, 4];
      // var newList = list.map((value) {
      //   return (value * 2);
      // });
      //等价于上面的表达式:map代表的是遍历取出value,然后返回对应的表达式
      var newList = list.map((value) => value * 2);
      print(newList);
    
      //where 代表每一个value满足这个表达式条件的筛选集合
      newList = list.where((value) {
        print(value);
        return value < 4;
      });
      print(newList.toList());
      //any方法,代表集合里有个满足条件就返回true,经过print打印发现,
      //any寻找到满足条件后的值后不会再循环变量
      bool flag = list.any((value) {
        print(value);
        return value < 4;
      });
      print(flag);
      //every方法代表集合中每一个值都满足条件,就返回true,否则返回false
      bool flag1 = list.every((value) {
        print(value);
        return value < 5;
      });
      print(flag1);
    }
    
    结果值:
    
    (2, 6, 8)
    1
    3
    4
    [1, 3]
    1
    true
    1
    3
    4
    true
    

    相关文章

      网友评论

          本文标题:Dart初识:数据类型、运算符、条件表达式等

          本文链接:https://www.haomeiwen.com/subject/wfpbkrtx.html