ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Dart —— dart:core 集合

2020-01-16 11:38:54  阅读:243  来源: 互联网

标签:core map 元素 list Dart assert fruits var dart


Dart汇总请点击这里

文章目录

Dart 附带了核心集合 API ,其中包括 list ,set 和 map 类。

Lists

如Dart基础中介绍,lists 可以通过字面量来创建和初始化。 另外,也可以使用 List 的构造函数。

List 类还定义了若干方法,用于向列表添加或删除项目。

// 使用 List 构造函数。
var vegetables = List();

// 或者仅使用一个 list 字面量。
var fruits = ['apples', 'oranges'];

// 添加一个元素到 list 对象。
fruits.add('kiwis');

// 添加多个元素到 list 对象。
fruits.addAll(['grapes', 'bananas']);

// 获取 list 长度。
assert(fruits.length == 5);

// 移除一个元素到 list 对象。
var appleIndex = fruits.indexOf('apples');
fruits.removeAt(appleIndex);
assert(fruits.length == 4);

// 移除多个元素到 list 对象。
fruits.clear();
assert(fruits.length == 0);

使用 indexOf() 方法查找一个对象在 list 中的下标值。

var fruits = ['apples', 'oranges'];

// 使用下标访问 list 中的元素
assert(fruits[0] == 'apples');

// 查找一个元素在 list 中的下标。
assert(fruits.indexOf('apples') == 0);

使用 sort() 方法排序一个 list 。

你可以提供一个排序函数用于比较两个对象。 比较函数在 小于 时返回 <0,相等 时返回 0,大于 时返回 > 0 。 下面示例中使用 compareTo() 函数, 该函数在 Comparable 中定义, 并被 String 类实现。

var fruits = ['bananas', 'apples', 'oranges'];

// 排序一个 list 。
fruits.sort((a, b) => a.compareTo(b));
assert(fruits[0] == 'apples');

list 是参数化类型, 因此可以指定 list 应该包含的元素类型:

// 这个 list 只能包含字符串类型。
var fruits = List<String>();

fruits.add('apples');
var fruit = fruits[0];
assert(fruit is String);

// 产生静态分析警告,num 不是字符串类型。
fruits.add(5); // BAD: Throws exception in checked mode.
fruits.add(5); // Error: 'int' can't be assigned to 'String'

Sets

在 Dart 中,set 是一个无序的,元素唯一的集合。 因为一个 set 是无序的,所以无法通过下标(位置)获取 set 中的元素。

添加移除元素

var ingredients = Set();
ingredients.addAll(['gold', 'titanium', 'xenon']);
assert(ingredients.length == 3);

// 添加一个重复的元素是无效的。
ingredients.add('gold');
assert(ingredients.length == 3);

// 从 set 中移除一个元素。
ingredients.remove('gold');
assert(ingredients.length == 2);

使用 contains() 和 containsAll() 来检查一个或多个元素是否在 set 中。

var ingredients = Set();
ingredients.addAll(['gold', 'titanium', 'xenon']);

// 检查一个元素是否在该 set 中。
assert(ingredients.contains('titanium'));

// 检查多个元素是否在该 set 中。
assert(ingredients.containsAll(['titanium', 'xenon']));

交集是另外两个 set 中的公共元素组成的 set 。

var ingredients = Set();
ingredients.addAll(['gold', 'titanium', 'xenon']);

// 创建两个 set 的交集。
var nobleGases = Set.from(['xenon', 'argon']);
var intersection = ingredients.intersection(nobleGases);
assert(intersection.length == 1);
assert(intersection.contains('xenon'));

Maps

map 是一个无序的 key-value (键值对)集合,就是大家熟知的 dictionary 或者 hash。 map 将 kay 与 value 关联,以便于检索。和 JavaScript 不同,Dart 对象不是 map 。

声明 map 可以使用简洁的字面量语法,也可以使用传统构造函数:

// map 通常使用字符串作为 key。
var hawaiianBeaches = {
  'Oahu': ['Waikiki', 'Kailua', 'Waimanalo'],
  'Big Island': ['Wailea Bay', 'Pololu Beach'],
  'Kauai': ['Hanalei', 'Poipu']
};

// map 可以通过构造函数构建。
var searchTerms = Map();

// map 是参数化类型;
// 可以指定一个 map 中 key 和 value 的类型。
var nobleGases = Map<int, String>();

通过大括号语法可以为 map 添加,获取,设置元素。 使用 remove() 方法从 map 中移除键值对。

var nobleGases = {54: 'xenon'};

// 使用 key 检索 value 。
assert(nobleGases[54] == 'xenon');

// 检查 map 是否包含 key 。
assert(nobleGases.containsKey(54));

// 移除一个 key 及其 value。
nobleGases.remove(54);
assert(!nobleGases.containsKey(54));

可以从一个 map 中检索出所有的 key 或所有的 value:

var hawaiianBeaches = {
  'Oahu': ['Waikiki', 'Kailua', 'Waimanalo'],
  'Big Island': ['Wailea Bay', 'Pololu Beach'],
  'Kauai': ['Hanalei', 'Poipu']
};

// 获取的所有的 key 是一个无序集合
// (可迭代 list 对象)。
var keys = hawaiianBeaches.keys;

assert(keys.length == 3);
assert(Set.from(keys).contains('Oahu'));

// 获取的所有的 value 是一个无序集合
// (可迭代 list 对象).
var values = hawaiianBeaches.values;
assert(values.length == 3);
assert(values.any((v) => v.contains('Waikiki')));

使用 containsKey() 方法检查一个 map 中是否包含某个key 。

因为 map 中的 value 可能会是 null , 所有通过 key 获取 value,并通过判断 value 是否为 null 来判断 key 是否存在是不可靠的。

var hawaiianBeaches = {
  'Oahu': ['Waikiki', 'Kailua', 'Waimanalo'],
  'Big Island': ['Wailea Bay', 'Pololu Beach'],
  'Kauai': ['Hanalei', 'Poipu']
};

assert(hawaiianBeaches.containsKey('Oahu'));
assert(!hawaiianBeaches.containsKey('Florida'));
如果当且仅当该 key 不存在于 map 中,且要为这个 key 赋值, 可使用putIfAbsent()方法。 该方法需要一个方法返回这个 value 。

var teamAssignments = {};
teamAssignments.putIfAbsent(
    'Catcher', () => pickToughestKid());
assert(teamAssignments['Catcher'] != null);

公共集合方法

List, Set, 和 Map 共享许多集合中的常用功能。 其中一些常见功能由 Iterable 类定义, 这些函数由 List 和 Set 实现。

虽然Map没有实现 Iterable, 但可以使用 Map keys 和 values 属性从中获取 Iterable 对象。

使用 isEmpty 和 isNotEmpty 方法可以检查 list, set 或 map 对象中是否包含元素:

var coffees = [];
var teas = ['green', 'black', 'chamomile', 'earl grey'];
assert(coffees.isEmpty);
assert(teas.isNotEmpty);

使用 forEach() 可以让 list, set 或 map 对象中的每个元素都使用一个方法。

var teas = ['green', 'black', 'chamomile', 'earl grey'];

teas.forEach((tea) => print('I drink $tea'));

当在 map 对象上调用 `forEach() 方法时,函数必须带两个参数(key 和 value):

hawaiianBeaches.forEach((k, v) {
  print('I want to visit $k and swim at $v');
  // 我想去瓦胡岛并且在
  // [Waikiki, Kailua, Waimanalo]游泳, 等等。
});

Iterable 提供 map() 方法,这个方法将所有结果返回到一个对象中。

var teas = ['green', 'black', 'chamomile', 'earl grey'];

var loudTeas = teas.map((tea) => tea.toUpperCase());
loudTeas.forEach(print);

map() 方法返回的对象是一个 懒求值(lazily evaluated)对象: 只有当访问对象里面的元素时,函数才会被调用。

使用 map().toList() 或 map().toSet() , 可以强制在每个项目上立即调用函数。

var loudTeas =
    teas.map((tea) => tea.toUpperCase()).toList();

使用 Iterable 的 where() 方法可以获取所有匹配条件的元素。

使用 Iterable 的 any() 和 every() 方法可以检查部分或者所有元素是否匹配某个条件。

var teas = ['green', 'black', 'chamomile', 'earl grey'];

// 洋甘菊不含咖啡因。
bool isDecaffeinated(String teaName) =>
    teaName == 'chamomile';

// 使用 where() 来查找元素,
// 这些元素在给定的函数中返回 true 。
var decaffeinatedTeas =
    teas.where((tea) => isDecaffeinated(tea));
// 或者 teas.where(isDecaffeinated)

// 使用 any() 来检查集合中是否至少有一个元素满足条件。
assert(teas.any(isDecaffeinated));

// 使用 every() 来检查集合中是否所有元素满足条件。
assert(!teas.every(isDecaffeinated));
阿拉阿伯 发布了68 篇原创文章 · 获赞 38 · 访问量 6万+ 私信 关注

标签:core,map,元素,list,Dart,assert,fruits,var,dart
来源: https://blog.csdn.net/rd_w_csdn/article/details/104001345

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有