文章目录

  • 简介
  • 使用字面量创建集合
  • 不要使用.length来判断集合是否为空
  • 可遍历对象的遍历
  • List.from和iterable.toList
  • where和whereType
  • 避免使用cast
  • 总结

简介

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中的集合使用最佳实践。

本文已收录于 http://www.flydean.com/30-dart-collection/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

dart系列之:集合使用实践相关推荐

  1. dart系列之:手写Library,Library编写实践

    文章目录 简介 使用part和part of src中的文件 package中的lib文件 总结 简介 Library是dart用来组织代码的一种非常有用的方式,通过定义不同的Library,可以将非 ...

  2. ASP.NET MVC实践系列9-filter原理与实践

    filter实际上是一个特性(attribute),它提供了一种向controller 或 action中添加某些任务的方法,当controller 或 action被调用时,会触发filter中定义 ...

  3. 懂集合吗?对,是dart中的集合

    文章目录 简介 List的使用 Set的使用 Map的使用 常见的集合方法 总结 简介 dart中的集合有三个,分别是list,set和map.dart在dart:core包中提供了对于这三种集合非常 ...

  4. dart系列之:dart语言中的特殊操作符

    dart系列之:dart语言中的特殊操作符 文章目录 简介 普通操作符 类型测试操作符 条件运算符 级联符号 类中的自定义操作符 总结 简介 有运算就有操作符,dart中除了普通的算术运算的操作符之外 ...

  5. java集合系列——java集合概述(一)

    在JDK中集合是很重要的,学习java那么一定要好好的去了解一下集合的源码以及一些集合实现的思想! 一:集合的UML类图(网上下载的图片) Java集合工具包位置是java.util.* 二:集合工具 ...

  6. 全国31省市GDP及农业系列数据集合(1999-2019年)

    数据集名称:全国31省市GDP及农业系列数据集合 时间范围:1999-2019年 数据来源:国家统计局 包含字段:各省GDP.农业总产值.粮食产量.农业机械总动力.化肥施用量.农村用电量 部分数据截图 ...

  7. 明翰Java教学系列之集合框架篇V0.2(持续更新)

    文章目录 传送门 前言 什么是集合框架 集合框架体系 Collection接口 `Set接口` `HashSet` LinkedHashSet TreeSet EnumSet Queue接口 Prio ...

  8. dart系列之:和null说再见,null使用真实实践

    文章目录 简介 不需要初始化对象为null null的三元操作符 如果在使用中需要判断类型是否为空,则不要使用late 本地变量的类型提升 总结 简介 null可能是大家在编写程序中最为头疼的一个东西 ...

  9. dart系列之:dart代码规范实践指南

    文章目录 简介 命名规则 import中的顺序 格式化 总结 简介 每种语言都有自己的代码风格,这种代码风格是跟语言特性息息相关的.如果在编码的过程中遵循这种统一的编码规则,会给我们的业务带来非常多的 ...

最新文章

  1. JavaScript:事件冒泡和事件委托
  2. python下载安装教程mac-Anaconda2 Mac版下载
  3. linux系统性能优化及瓶颈分析
  4. 版本控制入门-----搬进Github
  5. python list 查找find_List 泛型 集合中 Find 的用法
  6. 数据库编程起别名的3中方式
  7. 域内禁止不明东西连接DHCP
  8. 多个小int的乘法小心溢出哦(记洛谷P1615题WA的经历,Java语言描述)
  9. 深入理解Java:SimpleDateFormat安全的时间格式化 ;
  10. 多个折线样式_Python数据可视化实例:关于图表“贵族”折线的增强优化方法
  11. python程序设计与实验_用于创建实验的Python应用程序和库
  12. EWAHCompressedBitmap数据结构及原理
  13. 各种排序算法、十大排序算法
  14. 最强手机编程App - Dcoder汉化版
  15. python实现之多元函数作图
  16. VC++ 编写程序计算月亮方位,高度,赤经,赤纬等信息
  17. NCBI查看基因注释信息
  18. 在FreeBSD下安装subversion
  19. java设计模式知识总结(23种)
  20. 有一篇文章,共有 3 行文字,每行有 80 个字符。编写程序分别统计出其中英文大写 字母、英文小写字母、数字、空格以及其他字符的个数

热门文章

  1. 数据挖掘竞赛-美国King County房价预测训练赛
  2. Python配置-virtualenv和conda的区别
  3. POJ1177矩形面积并(矩形切割+括号匹配)
  4. 漫游Kafka设计篇之Producer和Consumer
  5. cocos2d-x初探学习笔记(12)--图形绘制
  6. 抖音直播间弹幕protocbuf分析
  7. nginx如何开启debug日志及相关配置
  8. 手写实现Spring(IOC、DI),SpringMVC基础功能
  9. 高级/专家工程师职位和面试题
  10. 深入理解DPDK程序设计|Linux网络2.0