[Flutter学习之Dart基础] - 集合(List, Set,Map)

Dart 中的集合主要包含三种类型,List,Set,Map。这个在Java语言中其实也有,只是没有Java中那么丰富。

Lists

这是一个使用频率非常高的集合。它有很多创建方式。

直接创建

dart 复制代码
var grains = <String>[] //声明一个String类型的数组
var fruits = ['apples', 'oranges'];//也是声明一个String类型的数组

前者是直接确定类型。第二种方式是用类类型推断,间接的声明了数组元素的类型。它还可以直接通过一些构造方法来创建。如:

dart 复制代码
var vegetables = List.filled(99, 'broccoli');

其实list的操作和Java很类似,基本上的方法都是支持的

dart 复制代码
fruits.add('kiwis'); //添加单个元素
fruits.addAll(['grapes', 'bananas']); //添加多个元素
print(fruits[1]); // 输出下标为1的元素
var appleIndex = fruits.indexOf('apples');//查找元素的下标
fruits.clear();//清楚所有元素
Sets

Set是一个无序的集合。因为它是无序的,所以不能通过index下标来获取其中的元素。创建方式的话,也是有很多种。

dart 复制代码
var ingredients = <String>{} // 注意,这里和list不一样,list是[],而Set是{}
var atomicNumbers = Set.from([79, 22, 54]);// 通过构造函数的方式创建
var ingredients = Set<String>(); // 通过默认构造函数创建

添加,删除,以及判断该元素是否已存在等部分数组通用操作都是支持的。

dart 复制代码
ingredients.add('gold'); //添加单个元素
ingredients.addAll(['gold', 'titanium', 'xenon']); // 添加多个元素
ingredients.remove('gold'); // 删除某个元素
assert(ingredients.contains('titanium'));// 判断是否包含某个元素
print(intersection.length) // 获取数组元素个数

从set里取值相对有点麻烦,尤其是取某个特定的值。所以如果需要频繁的存、取操作的时候,就不是很适合使用Set。

dart 复制代码
  print(ingredients.toList()[0]) // 直接转化成list然后通过下标的方式获取它的某个值,这是一种方式。

但因为它是无序的,所以你存的顺序不确定,所以在你想取它的值的时候,你是不知道下标的。所以使用场景非常有限。

dart 复制代码
  var iterator = ingredients.iterator;
  if (iterator.moveNext()) { // 先移动到第一个元素
    var randomElement2 = iterator.current; // 然后获取当前元素
    print(randomElement2);
  }

所以我们大多数情况下去使用Set之后,取值都是通过迭代器的方式去遍历获取你想要的值。

Maps

Map也是一个使用非常频繁的集合了。它和list以及set有点不太一样,它是key-value的形式存值的。

创建Map的方式有多种

  1. 直接使用字面量创建

    dart 复制代码
    //
    // 定义一个存储学生信息的Map
    Map<String, dynamic> student = {
      'name': 'Alice',
      'age': 20,
      'scores': {'math': 90, 'english': 85} // 嵌套Map
    };
    
    print(student); 
    // 输出: {name: Alice, age: 20, scores: {math: 90, english: 85}}
  2. 使用构造函数Map()

    dart 复制代码
    Map<String, int> scores = Map();
    scores['math'] = 90;
    scores['english'] = 85;
    
    print(scores); // 输出: {math: 90, english: 85}
  3. 通过Map.from()复制现有Map

    dart 复制代码
    Map<String, int> original = {'a': 1, 'b': 2};
    Map<String, int> copied = Map.from(original);
    copied['c'] = 3;
    
    print(copied); // 输出: {a: 1, b: 2, c: 3}
  4. 使用Map.of创建不可变Map

    dart 复制代码
    Map<String, int> immutableMap = Map.of({'x': 10, 'y': 20});
    // 尝试修改会报错:immutableMap['z'] = 30; // 抛出异常

Map的常用方法和属性

  1. 添加/修改/访问元素

    dart 复制代码
    Map<String, int> scores = {'math': 90};
    scores['english'] = 85; // 添加新键
    scores['math'] = (scores['math'] ?? 0) + 5; //访问并且修改现有键的值
    
    print(scores); // 输出: {math: 95, english: 85}
  2. 遍历Map

    dart 复制代码
    scores.forEach((key, value) { // 应为Map也是一个集合,集合都支持forEach这个方法来遍历其中的元素
      print('$key: $value');
    });
    
    for (var entry in scores.entries) { // 也可以通过for循环,当然,还有while。do...while都可以。
      print('${entry.key}: ${entry.value}');
    }
    // 他们的输出都是:
    // math: 95
    // english: 85
  3. 获取所有Key或者value

    dart 复制代码
    var keys = scores.keys; // Iterable<String>
    var values = scores.values; // Iterable<int>
    
    print(keys); // 输出: (math, english)
    print(values); // 输出: (95, 85)
  4. 检查Key或者value是否存在

    dart 复制代码
    bool hasMath = scores.containsKey('math'); // true
    bool hasScore90 = scores.containsValue(90); // false(当前值是95)
    
    print(hasMath); // true
  5. 合并Map

    dart 复制代码
    Map<String, int> moreScores = {'science': 88};
    scores.addAll(moreScores);
    
    print(scores); // 输出: {math: 95, english: 85, science: 88}
  6. 删除元素

    dart 复制代码
    scores.remove('english'); // 移除键"english"
    scores.clear(); // 清空所有元素

初期先了解一下这些常用的方法。方便后面学UI组件的时候能直接使用的的上,不用再去翻文档吧。

相关推荐
微祎_7 分钟前
Flutter for OpenHarmony:构建一个 Flutter 重力弹球游戏,2D 物理引擎、手势交互与关卡设计的工程实现
flutter·游戏·交互
crmscs38 分钟前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob40 分钟前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
一起养小猫43 分钟前
Flutter for OpenHarmony 实战_魔方应用UI设计与交互优化
flutter·ui·交互·harmonyos
机建狂魔1 小时前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei9961 小时前
flutter和Android动画的对比
android·flutter·动画
一只大侠的侠1 小时前
Flutter开源鸿蒙跨平台训练营 Day7Flutter+ArkTS双方案实现轮播图+搜索框+导航组件
flutter·开源·harmonyos
一只大侠的侠2 小时前
Flutter开源鸿蒙跨平台训练营 Day9分类数据的获取与渲染实现
flutter·开源·harmonyos
一只大侠的侠2 小时前
Flutter开源鸿蒙跨平台训练营 Day 5Flutter开发鸿蒙电商应用
flutter·开源·harmonyos
lxysbly3 小时前
md模拟器安卓版带金手指2026
android