flutter入门之dart中的集合、动态类型和函数

原文地址:https://www.jianshu.com/p/beb9325d2196
1 list
dart 中的list 在没有指定泛型的情况下 默认是object的
所以如下写法是可以的

void main() {
  List list = new List();
  list.add("aa");
  list.add(1);
  list.add(1.2);
  print(list); 
}

当指定泛型 比如list<int> 以上写法就会报错
2 map
dart 中不存在接口的概念
基本操作

 Map<String,Object> map = new Map<String,Object>();
 map['abc'] = 'bbb';
 print(map);
 map.containsKey("abc"); //是否存在当前key  true
  map.containsValue("bbb");//是否存在当前value true
  map.isEmpty;//false
  map.isNotEmpty;//true
  map.keys;//获取所有的key [abc]
  map.values;//获取所有的value [bbb]

3 set
基本操作

void main(){
  Set set = new Set();
  Set newSet = new Set();
  newSet.add("bac");
  set.add("daba");
  set.remove("daba");
  Set unionSet = set.union(newSet);//可以和其他的set拼接,返回合并的集合
  set.add(1);
  set.add([1,2,3]);
  print(set);//{1, [1, 2, 3]}
  print(unionSet);//{bac}
}

4 集合遍历
基本操作

void main(){
  Map<String,Object> map = new Map<String,Object>();
  map['abc'] = 'abc';
  map['bbb'] = 'abc';
  map.forEach((key,value){
    print(key+",value:"+value);//abc,value:1   bbb,value:3
  });
  List list = ['1','a','pdc'];
  for(int i = 0;i<list.length;i ++){
    print('value:'+list[i]); //value:1 value:a value:pdc
  }
  Set set = {'abc',1212,'bbb'};
  //set和list之间可以直接使用toList或者toSet方法进行转换,但是map不可以直接进行转换!map需要转换成list或者set可以选择获取keys/values进行toList/toSet转换操作
  set.toList().forEach((value){
     print(value);  //abc 1212 bbb
  });
}

5 动态变量类型
var
var的特性我们在js中都很熟悉,可以随意给var类型的变量赋值,但是在dart中,var只是可以让你后期再申明具体的类型,并不是可以任意改动类型(面向对象语言通病),如果你在申明了一次变量以后,再去设置一个新的类型,那么编译器就会直接抛出异常

  var t;
  t="hi world";
  t=1000;// 下面代码在dart中会报错,因为变量t的类型已经确定为String,

dynamic
在dart中存在一个情况,我们前期不确定这个类型,但是后期又想修改掉怎么办?var不能修改类型,有木有这种完全动态的类型呢?有,dynamic关键字就是完全动态的类型,和var的区别在于,var是在编译期就确定了类型,也就是说当第一次申明以后就确定了类型,而dynamic是属于运行时动态类型,也就是说你可以任意修改类型或者申明,只要最终运行的时候能确定类型,使用如下:

dynamic t;//很坑的是这个类型目前的dart插件居然没有代码提示必须全部写完才出现,不能判断正确性
t = "hi world";
t = 1000;//可以进行修改申明类型
print(t);//输出为:1000

Object
dart这个语言和java一样,一切都是对象,并且一切对象的基类都是Object,所以在dart中同样支持使用Object来申明任意类型,并且Object无限制可以接受任何类型,那么Object和dynamic的区别在哪呢?两者都可以动态接受类型并且都是运行时确定类型的啊,别急,我们看一个简单的案例:

dynamic a = "a";
Object b = "b";
void main() {
     print(a.length);//这里可以调用length属性,完美输出
     print(b.length);//这里是object类型就不能调用length方法,编译就报错
 }   

从上面的案例就能看出来区别,dynamic属于动态改变的类型,也就是说编译器会根据你申明的类型自动推断为该类型,所以该类型的所有的属性都可以使用,但是使用Object的类编译器无法推断具体类型,默认为还是Object类型,所以只能调用Object的属性和方法,而Object中不存在length,所以就会报错,所以总结下来,Object是需要手动转换具体类型来进行操作,而dynamic属于自动推断类型,调用该类型的属性,灵活度来说dynamic更高,但是按照代码的严谨性和可读性来说Object更高更不容易出错,所以一般来说,在大部分代码不是很严格的环境下,我们会选择dynamic来替代Object进行开发,提高灵活度
6 常量
const
dart中同时包含了js的const和final两个常量类型,在dart中const是编译常量,也就是说当const修饰了这个变量以后,如果再去修改,编译器直接就报错(这里应该是完全沿袭js中的const)

const str1 = "hi world";
str1 = "aaa";//编译器直接报错
var list =  const [1, 2, 3];//const还可以修饰变量对应的值,强制让这个值也变成固定的

final
dart 中 final const 定义的定义的变量都不可以再修改 区别是final只能修饰变量
const 除了能修饰变量还可以修饰值
“ swift
final str1 = “hi world”;
str1 = “bbb”;//这里也会报错

并且使用const修饰的常量可以作为构造,如果构造是完全一样的,这时候使用的是同一个实例,用于提高编译和运行的效率
```swift
getConst() => const [1, 2];
main() {
  var a = getConst();
  var b = getConst();
  identical(a, b); // =>true
}
    原文作者:weixin_33762130
    原文地址: https://blog.csdn.net/weixin_33762130/article/details/90784100
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞