Flutter之旅
上QQ阅读APP看书,第一时间看更新

2.1.1 常用的数据类型

Dart的常用数据类型如下:

数字类型

Dart语言中,num、int和double都是类,也就对象级别,默认值为null,这不同于Java的基本数据类型,而且Dart语言没有float、long等数据类型。下面的代码表示用整型乘除浮点型时,结果是浮点型:

布尔类型

Dart语言中的布尔类型也是严谨的,只有true和false两个值。布尔类型作为判断的标识,活跃在各大语言的逻辑判断中。现在绝大多数语言的布尔运算都是严谨的,用法也比较简单。注意,关键字是bool,这和Java是不同的:


---->[day2/02/bool.dart]---- 
bool isMan = true; 
bool isMarried = false;

字符串类型

字符串是编程语言中不可或缺的部分。说它简单,拼拼合合,非常简单;说它难,正则一出马,它也难如登天。需要注意的是,在Dart语言中,字符串支持单引号、双引号以及三引号,其中,单引号和双引号中的双引号需要转义,三引号会将内容原样输出,连注释都无法“逃脱”。另外,${exp}可以在字符串内插入字符串表达式exp,示例如下:

列表类型

列表可以根据泛型盛放多个同类元素,在编程语言中也是必备的类型。Dart语言中的List也是一个类,在使用方式上你会感觉它像数组。不过它可以随意对元素进行增删改查,示例如下:


---->[day2/02/list.dart]----
  List<String> languages = ['Java', 'Dart', 'Python', 'C++', 'Kotlin'];
  print(languages[0]); //Java 访问索引为0的元素
  
  languages.add("JavaScript");//添加元素
  print(languages.length);//6 数组长度
  languages.removeAt(1);//移除第一个元素
  languages.insert(3, "PHP");//定点插入
  print(languages);//[Java, Python, C++, PHP, Kotlin, JavaScript]
  print(languages.getRange(3, 5));//(PHP, Kotlin)  获取指定访问的元素
  print(languages.sublist(2, 4)); //[C++, PHP] 截取
  
  print(languages.join("!")); //Java!Python!C++!PHP!Kotlin!JavaScript
  print(languages.isEmpty);//false  获取指定访问的元素是否为空
  print(languages.contains("Ruby"));//false  是否包含
  languages.clear();//清空

关于列表,这里介绍几个要点:


---->[元素类型转化:通过map函数遍历列表并生成新元素列表]----
List<String> strNum = ['11', '23', '34', '24', '65'];
var intNum= strNum.map((String str)=> int.parse(str)).toList();
print(intNum);//[11, 23, 34, 24, 65]
---->[条件遍历过滤出列表:通过map函数遍历列表并生成新元素列表]----
var bigThan30= intNum.where((int num)=>num>30).toList();
print(bigThan30);//[34, 65]
---->[列表解构]----
var parser=[0,100,...intNum,30];
print(parser);//[0, 100, 11, 23, 34, 24, 65, 30]
---->[构造列表时允许执行if语句]----
bool flag=bigThan30.length >= 3;
var chooseLi=[if(!flag) 666,...parser,if(flag) 555 else 55];
print(chooseLi);//[666, 0, 100, 11, 23, 34, 24, 65, 30, 55]

集合类型

众所周知,集合和列表的区别在于集合中的元素不能重复。所以添加重复元素时会返回false,表示没加进去。这就像数学中的集合,Set类中也包含集合运算的方法:


---->[day2/02/set.dart]----
Set<String> languages = {'Java', 'Dart', 'Python', 'C++', 'Kotlin',"Java"};
print(languages);//{Java, Dart, Python, C++, Kotlin}
print(languages.add('Java'));//false 表示没添加进去
print(languages.add('JavaScript'));//true
print(languages.contains("Dart"));//true 是否存在
languages.remove("JavaScript");//移除元素
print(languages.toList());//列表化  //[Java, Dart, Python, C++, Kotlin] 
languages.forEach((e){print(e);});//遍历
print({1,2,3,4}.difference({2,3,6}));//{1, 4},两个不同元素构成的集合
print({1,2,3,4}.union({2,3,6}));//{1, 2, 3, 4, 6} 并集
print({1,2,3,4}.intersection({2,3,6}));//{2, 3} 交集

映射类型

Map作为若干个键值对的容器,享有映射之名。要注意一个Map对象的键不能重复,值可以重复。在Dart语法中,Map比较灵活,和列表之间相互转化非常方便:


---->[day2/02/map.dart]----
Map<String,num> dict = {"a": 1, "b": 30, "c": 70, "price": 40.0};
print(dict); //{a: 1, b: 30, c: 70, price: 40.0}
print(dict["price"]); //40.0
dict["a"] = 2;//修改
print(dict); //{a: 2, b: 30, c: 70, price: 40.0}
print(dict.containsKey("price")); //true 是否包含键
print(dict.containsValue("price")); //false 是否包含值
print(dict.isEmpty); //false 是否为空
print(dict.isNotEmpty); //true 是否不为空
print(dict.length); //4 长度
dict.remove("c");//移除
print(dict); //{a: 2, b: 30, price: 40.0}
print(dict.keys.toList());//[a, b, price] 将键转为数组
print(dict.values.toList());//[2, 30, 40.0] 将值转为数组
List<int> numLi=[1,2,3,4,5];
List<String> numEN=["one","two","three","four","five"];
List<String> numCN=["壹","贰","叁","肆","伍"];
Map<int,String> mapEN= Map.fromIterables(numLi, numEN);
 Map<int,String> mapCN= Map.fromIterables(numLi, numCN);
print(mapCN);//{1: 壹, 2: 贰, 3: 叁, 4: 肆, 5: 伍}
print(mapEN);//{1: 壹, 2: 贰, 3: 叁, 4: 肆, 5: 伍}
// {1: one, 2: two, 3: three, 4: four, 5: five}
print(Map.fromIterables(mapEN.values, mapCN.values));