[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组件的时候能直接使用的的上,不用再去翻文档吧。

相关推荐
流星白龙3 小时前
【MySQL】7.MySQL基本查询(2)
android·mysql·adb
mldlds4 小时前
MySQL加减间隔时间函数DATE_ADD和DATE_SUB的详解
android·数据库·mysql
钛态5 小时前
Flutter for OpenHarmony:mockito 单元测试的替身演员,轻松模拟复杂依赖(测试驱动开发必备) 深度解析与鸿蒙适配指南
服务器·驱动开发·安全·flutter·华为·单元测试·harmonyos
智算菩萨6 小时前
MP3音频编码原理深度解析与Python全参数调优实战:从心理声学模型到LAME编码器精细控制
android·python·音视频
studyForMokey7 小时前
【Android面试】Activity生命周期专题
android·面试·职场和发展
chehaoman8 小时前
MySQL的索引
android·数据库·mysql
念格8 小时前
Flutter 弹窗 UI 不刷新?用 StatefulBuilder 解决
flutter
程序员老刘10 小时前
2026春招Flutter岗位为何变少?我看到的3个招聘逻辑变化
flutter·ai编程·客户端
念格10 小时前
Flutter 实现点击任意位置收起键盘的最佳实践
flutter
恋猫de小郭10 小时前
React Native 鸿蒙 2026 路线发布,为什么它的适配成本那么高?
android·前端·react native