dart系列之:集合使用最佳实践

简介: dart系列之:集合使用最佳实践

目录



简介


dart中有四种集合,分别是Set,List,Map和queues。这些集合在使用中需要注意些什么呢?什么样的使用才是最好的使用方法呢?一起来看看吧。


使用字面量创建集合


对于常用的Set,Map和List三个集合来说,他们是有自己的无参构造函数的:


factory Set() = LinkedHashSet<E>;
  external factory Map();
  @Deprecated("Use a list literal, [], or the List.filled constructor instead")
  external factory List([int? length]);


可以看到Set和Map是可以使用构造函数的。但是对于List来说,无参的构造函数已经不推荐使用了。


对于Set和Map来说,可以这样构造:


var studentMap = Map<String, Student>();
var ages = Set<int>();


但是dart官方推荐直接使用字面量来创建这些集合,如下所示:


var studentMap = <String, Student>{};
var ages = <int>{};


为什么呢?这是因为dart中的字面量集合是非常强大的。可以通过扩展运算符,if和for语句对集合进行构造和扩展,如下所示:


var studentList = [
  ...list1,
  student1,
  ...?list2,
  for (var name in list3)
    if (name.endsWith('jack'))
      name.replaceAll('jack', 'mark')
];


不要使用.length来判断集合是否为空


对应dart的可遍历集合来说,这些集合并没有存储集合的长度信息,所以如果你调用集合的.length方法,可能会导致集合的遍历,从而影响性能。


注意Set和List是可遍历的,而Map是不可遍历的。


所以,我们需要调用集合的.isEmpty 和 .isNotEmpty方法来判断集合是否为空,这样速度更快。


if (studentList.isEmpty) print('it is empty');
if (studentList.isNotEmpty) print('it is not empty');


可遍历对象的遍历


对应Set和List这两个可遍历的集合来说,有两种遍历方法,可以通过调用forEach() 方法或者for-in来进行遍历,如下所示:


for (final student in studentList) {
  ...
}


studentList.forEach((student) {
  ...
});


这两种方法中,dart推荐使用for in的写法。


当然,如果你想将现有的function应用在集合中的每个元素中,forEach也是可以的:


studentList.forEach(print);


注意,因为Map是不可遍历的,所以上面的规则对Map并不适用。


List.from和iterable.toList


可遍历对象可以通过调用toList将其转换成为List,同样的List.from也可以将可遍历对象转换成为List。


那么两者有什么区别呢?


var list1 = iterable.toList();
var list2 = List.from(iterable);


两者的区别是iterable.toList并不会改变list中数据的类型,而List.from会. 举个例子:


// Creates a List<String>:
var studentList = ['jack', 'mark', 'alen'];
// Prints "List<String>":
print(studentList.toList().runtimeType);
// Prints "List<dynamic>":
print(List.from(studentList).runtimeType);


当然,你也可以使用List.from来强制对创建出来的List进行类型转换。


List<String>.from(studentList)


where和whereType


对于可遍历对象来说,两个过滤集合中元素的方法,他们是where和whereType。


比如,我们需要过滤List中的字符串,则可以这样写:


var studentList = ['jack', 'ma', 18, 31];
var students1 = studentList.where((e) => e is String);
var students2 = studentList.whereType<String>();


看上去两者没有太大的区别,都可以得到应有的结果。但是两者事实上还是有区别的,因为对应where来说,返回的是一个Iterable<Object>,所以上面的例子中,如果我们真的需要返回String,还需要对返回结果进行case:


var students1 = studentList.where((e) => e is String).cast<String>();;


所以,如果你要返回特定的对象时候,记得使用whereType。


避免使用cast


cast通常用来对集合中的元素进行类型转换操作,但是cast的性能比较低,所以在万不得已的情况下,一定要避免使用cast。


那么如果不使用cast,我们怎么对类型进行转换呢?


一个基本的原则就是在构建集合的时候提前进行类型转换,而不是在构建集合之后再进行整体的cast。


比如下面的例子从一个dynamic类型的List转换成为int类型的List,那么我们可以在调用List.from方法的时候进行类型转换:


var stuff = <dynamic>[1, 2];
var ints = List<int>.from(stuff);


如果是map的话,可以这样操作:


var stuff = <dynamic>[1, 2];
var reciprocals = stuff.map<double>((n) => 1 / n);


比如我们需要构建一个int的List,那么在创建之初就可以指定List的内部类型,然后再对其添加元素:


List<int> singletonList(int value) {
  var list = <int>[];
  list.add(value);
  return list;
}


总结



以上就是dart中的集合使用最佳实践。

相关文章
|
存储 网络协议 数据安全/隐私保护
POP3/SMTP/IMAP邮件协议的区别
POP3/SMTP/IMAP邮件协议的区别
POP3/SMTP/IMAP邮件协议的区别
|
自然语言处理 Java API
阿里云自然语言处理--文本相似度(电商)Java SDK 调用示例
自然语言处理(Natural Language Processing,简称NLP),是为各类企业及开发者提供的用于文本分析及挖掘的核心工具,旨在帮助用户高效的处理文本,已经广泛应用在电商、文娱、司法、公安、金融、医疗、电力等行业客户的多项业务中,取得了良好的效果。文本相似度可以提供不同文本之间相似度的计算,并输出一个介于0到1之间的分数,分数越大则文本之间的相似度越高。可广泛应用于信息检索,新闻推荐、智能客服等场景。使用该服务建议分数不要用于直接判断,可以作为特征,并按照范围进行分桶。本文将使用Java Common SDK 演示文本相似度(电商)服务的快速调用以供参考。
990 0
阿里云自然语言处理--文本相似度(电商)Java SDK 调用示例
|
人工智能 文字识别 API
20行代码教你如何批量提取图片中文字
大家好,我是志斌~ 之前志斌在考研的时候遇到了一个问题,就是要将图片中的文字给提取出来,当时是J哥帮忙搞出来的,现在已经考完研了,也学会了提取方式,现在来给大家分享一下。
1506 0
20行代码教你如何批量提取图片中文字
|
Linux
LINUX下载编译OpenH264
LINUX下载编译OpenH264
625 0
|
移动开发 编解码 缓存
H5离线包优化指南
在移动互联网时代的今天,市场上绝大多数终端App都在使用H5展示页面,且随着终端技术迭代更新和市场多变性,H5页面在App中的占比越来越重要。同时也暴露出一个所有App的共性问题,即性能优化。同样的H5页面的性能优化也是重点问题。 在mPaaS团队中虽然已将H5页面资源等打包做离线包了,但在复杂的客户环境、开发环境、市场环境下,客户端的H5离线包仍有性能优化问题,这里整理简单了集团下对H5离线包的优化策略方案,以供参考。
2775 1
H5离线包优化指南
阿里云商标注册不下来也收费吗?分情况!商标不通过驳回退款说明
理论上提交商标注册申请到商标局,商标局会收取规费,注册失败也是不可以退款的。但是阿里云推出一个商标安心注册申请,购买的是这个服务的话,哪怕商标注册申请没通过,被商标局驳回了,阿里云与你风险共担,也是可以退全款的
1621 0
阿里云商标注册不下来也收费吗?分情况!商标不通过驳回退款说明
|
人工智能 自然语言处理 安全
支小蜜校园团餐系统赋能校园食堂打餐效率提升70%
支小蜜智慧校园-团餐系统赋能校园食堂管理能力、提升打餐效率、降低人工成本。
支小蜜校园团餐系统赋能校园食堂打餐效率提升70%
|
缓存 虚拟化 数据安全/隐私保护
tuxera ntfs for mac功能介绍及怎么使用教程
用了 Mac,我们在使用移动硬盘的时候可能会遇到一个无法传输数据(如拷贝文件)的问题,这是因为部分移动硬盘是 NTFS 格式的,而 Mac 的磁盘不是这个格式,因此就会导致二者之间无法拷贝文件。有一个解决方法就是使用 Tuxera NTFS For Mac,有了它,我们就可以比较顺利地拷贝文件了。
1742 0
|
机器学习/深度学习 算法 数据挖掘
机器学习 基于IRIS鸢尾花数据集进行聚类分析
机器学习 基于IRIS鸢尾花数据集进行聚类分析
1135 0
机器学习 基于IRIS鸢尾花数据集进行聚类分析
|
canal 消息中间件 缓存
Canal v1.1.4版本避坑指南
在忍耐了很久之后,忍不住爆发了,在掘金发了条沸点(下班时发的)
710 0
Canal v1.1.4版本避坑指南

热门文章

最新文章