Flutter基础 -- Dart 语言 -- 列表集合枚举

目录

[1. 列表 List](#1. 列表 List)

[1.1 初始](#1.1 初始)

[1.2 声明](#1.2 声明)

[1.2.1 自动](#1.2.1 自动)

[1.2.2 定长](#1.2.2 定长)

[1.2.3 生成数据](#1.2.3 生成数据)

[1.3 属性](#1.3 属性)

[1.4 方法](#1.4 方法)

[1.4.1 添加](#1.4.1 添加)

[1.4.2 查询](#1.4.2 查询)

[1.4.3 删除](#1.4.3 删除)

[1.4.4 Range](#1.4.4 Range)

[1.4.5 洗牌](#1.4.5 洗牌)

[1.4.6 排序](#1.4.6 排序)

[1.4.7 复制子列表](#1.4.7 复制子列表)

[1.4.8 操作符](#1.4.8 操作符)

[2. 集合 Map](#2. 集合 Map)

[2.1 初始](#2.1 初始)

[2.2 声明](#2.2 声明)

[2.2.1 松散](#2.2.1 松散)

[2.2.2 强类型](#2.2.2 强类型)

[2.3 基本属性](#2.3 基本属性)

[2.4 常用方法](#2.4 常用方法)

[2.4.1 addAll](#2.4.1 addAll)

[2.4.2 addEntries](#2.4.2 addEntries)

[2.4.3 containsKey](#2.4.3 containsKey)

[2.4.4 containsValue](#2.4.4 containsValue)

[2.4.5 clear](#2.4.5 clear)

[2.4.6 remove](#2.4.6 remove)

[2.4.7 removeWhere](#2.4.7 removeWhere)

[2.4.8 update](#2.4.8 update)

[2.4.9 updateAll](#2.4.9 updateAll)

[2.5 操作符](#2.5 操作符)

[3. 集合 Set](#3. 集合 Set)

[3.1 声明](#3.1 声明)

[3.1.1 松散](#3.1.1 松散)

[3.1.2 强类型](#3.1.2 强类型)

[3.1.3 去重 & 转列表](#3.1.3 去重 & 转列表)

[3.2 基本属性](#3.2 基本属性)

[3.3 常用方法](#3.3 常用方法)

[3.3.1 交集](#3.3.1 交集)

[3.3.2 联合](#3.3.2 联合)

[4. 枚举 enum](#4. 枚举 enum)

[4.1 定义](#4.1 定义)

[4.2 使用场景](#4.2 使用场景)


1. 列表 List

1.1 初始

Dart 复制代码
var l = [1, 2, 3];
print(l);

[1, 2, 3]

1.2 声明

1.2.1 自动

Dart 复制代码
List<int> l = [];
l
..add(1)
..add(2)
..add(3);
print(l);

[1, 2, 3]

使用 cascade operator 连续调用 add 方法

cascade operator (..) 用于对同一个对象连续调用多个方法或访问多个属性

1.2.2 定长

Dart 复制代码
  var l = List<int>.filled(3, 0);//空间大小和默认值
  l[0] = 1;
  l[1] = 2;
  l[2] = 3;
  print(l);

  [1, 2, 3]

1.2.3 生成数据

Dart 复制代码
  List<int> l = List.generate(10, (index) {
    return index;
  });

  print(l);

  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

List.generate 是 Dart 的一个工厂构造函数,用于创建并生成固定长度的列表

第一个参数 10 指定生成列表的长度为 10

第二个参数是一个函数,称为生成器函数 (index 是生成器函数的参数),它根据每个索引值生成该索引处的元素

这个生成器函数比较简单:

(index) { return index; }

该函数接收一个参数 index,返回这个 index 值。因此,每个元素的值与其索引相同

List.generate 依次调用这个生成器函数时,它会依次传入从 09 的索引值,结果就是生成一个包含 09 的整数列表

1.3 属性

Dart 复制代码
var l = [1, 2, 3];
print(l.first);
print(l.last);
print(l.length);
print(l.isEmpty);
print(l.isNotEmpty);
print(l.reversed);

1
3
3
false
true
(3, 2, 1)

1.4 方法

1.4.1 添加

Dart 复制代码
List<int> l = [];

l
  ..add(1)
  ..addAll([2, 3, 4, 5])
  ..insert(0, 6)
  ..insertAll(6, [6, 6])
  ;

print(l);

[6, 1, 2, 3, 4, 5, 6, 6]

1.4.2 查询

Dart 复制代码
var l = [6, 1, 2, 3, 4, 5, 6, 6];

print(l.indexOf(5));
print(l.indexWhere((it) => it == 4));

5
4

1.4.3 删除

Dart 复制代码
var l = [6, 1, 2, 3, 4, 5, 6, 6];

l.remove(6);
print(l);
l.removeAt(5);
print(l);

[1, 2, 3, 4, 5, 6, 6]
[1, 2, 3, 4, 5, 6]

1.4.4 Range

Dart 复制代码
var l = [6, 1, 2, 3, 4, 5, 6, 6];

l.fillRange(0, 3, 9);
print(l.getRange(0, 5));

(9, 9, 9, 3, 4)

l.fillRange(0, 3, 9) 将把列表 l 的前 3([0,3]位置) 个元素(索引 0, 1, 2)替换为 9

getRange 方法返回一个新的不可变的迭代器,包含从起始索引到结束索引(不包括)的元素

1.4.5 洗牌

Dart 复制代码
var l = [6, 1, 2, 3, 4, 5, 6, 6];

l.shuffle();
print(l);
l.shuffle();
print(l);

[2, 5, 4, 6, 6, 3, 1, 6]
[6, 4, 6, 5, 2, 3, 6, 1]

调用一下就随机打乱一下

1.4.6 排序

Dart 复制代码
数字
var l = [6, 1, 2, 3, 4, 5, 6, 6];

l.sort();
print(l);

[1, 2, 3, 4, 5, 6, 6, 6]

日期
List<DateTime> dtList = [];
dtList.addAll([
  DateTime.now(),
  DateTime.now().add(new Duration(days: -12)),
  DateTime.now().add(new Duration(days: -2))
  ]);
print(dtList);

升序还是降序,目前是升序
dtList.sort((a, b) => a.compareTo(b));
print(dtList);

9
[2022-05-29 16:43:17.802, 2022-05-17 16:43:17.802, 2022-05-27 16:43:17.802]
[2022-05-17 16:43:17.802, 2022-05-27 16:43:17.802, 2022-05-29 16:43:17.802]

1.4.7 复制子列表

Dart 复制代码
var l = [6, 1, 2, 3, 4, 5, 6, 6];

var l2 = l.sublist(1,4);
print(l2);

[1, 2, 3] l不变

1.4.8 操作符

Dart 复制代码
var l1 = [1, 2, 3];
var l2 = [4, 5, 6];
print(l1 + l2);
l1[2] = 9;
print(l1[2]);

[1, 2, 3, 4, 5, 6]
9

2. 集合 Map

2.1 初始

key value 形式的集合,也叫键值对

Dart 复制代码
var a = {'name': 'ducafecat', 'web': 'www.ducafecat.tech'};

print(a);

{name: ducafecat, web: www.ducafecat.tech}

2.2 声明

2.2.1 松散

Dart 复制代码
var a = Map();
a['name'] = 'ducafecat';
a['web'] = 'www.ducafecat.tech';
a[0] = 'abc';
a[0] = '1231231';

print(a);

{name: ducafecat, web: www.ducafecat.tech, 0: 1231231}

就是有string 有int,key 相同,覆盖数据

2.2.2 强类型

Dart 复制代码
var a = Map<int, String>();
a[0] = 'java';
a[1] = 'python';

print(a);

{0: java, 1: python}

2.3 基本属性

Dart 复制代码
var a = {'name': 'ducafecat', 'web': 'www.ducafecat.tech'};
print(a.isEmpty);
print(a.isNotEmpty);
print(a.keys);
print(a.values);
print(a.length);
print(a.entries);

false
true
(name, web)
(ducafecat, www.ducafecat.tech)
2
(MapEntry(name: ducafecat), MapEntry(web: www.ducafecat.tech))

2.4 常用方法

2.4.1 addAll

新增 kv 数据

Dart 复制代码
b.addAll({'first': 'java', 'second': 'python'});

2.4.2 addEntries

接入另一个 map 集合

Dart 复制代码
b.addEntries(a.entries);

2.4.3 containsKey

检查 key 是否存在

Dart 复制代码
print(a.containsKey('name'));

2.4.4 containsValue

检查 value 是否存在

Dart 复制代码
print(a.containsValue('www.ducafecat.tech'));

2.4.5 clear

清空数据

Dart 复制代码
b.clear();

2.4.6 remove

删除数据

Dart 复制代码
a.remove('name');

2.4.7 removeWhere

按条件删除

Dart 复制代码
a.removeWhere((key,val) => key == 'name');

2.4.8 update

更新数据

Dart 复制代码
a.update('name', (val) => 'abc');

2.4.9 updateAll

更新批量

Dart 复制代码
a.updateAll((key, val) => "---$val---");

2.5 操作符

Dart 复制代码
print(a['name']);
a['name'] = 'abc';

3. 集合 Set

3.1 声明

Set 是一个元素唯一有序队列

3.1.1 松散

Dart 复制代码
var a = Set();
a.add('java');
a.add('php');
a.add('python');
a.add('java');
a.add('sql');
a.add('swift');
a.add('dart');

print(a);

{java, php, python, sql, swift, dart}

自动去重

Dart 允许 Set 中存储的值可以是任意类型。在这个示例中,Set 被使用来存储字符串类型的编程语言

3.1.2 强类型

Dart 复制代码
var b = <String>{};
b.addAll(['dart', 'c#', 'j#', 'e#']);

print(b);

{dart, c#, j#, e#}

通过使用泛型 <String>,你可以确保 Set 中的所有元素都是字符串类型。 addAll 方法用于批量添加元素到 Set

3.1.3 去重 & 转列表

Dart 复制代码
var ls = ['dart', 'java', 'c#', 'j#', 'e#', 'java'];
var tags = Set();
tags.addAll(ls);
print(tags);
print(tags.toList());

{dart, java, c#, j#, e#}
[dart, java, c#, j#, e#]

3.2 基本属性

和之前map差不多的就不多说了

3.3 常用方法

3.3.1 交集

Dart 复制代码
var fd = <String>{"js", "node", "dart", "css", "html", "macos", "docker", "git"};
var ed = <String>{"linux", "docker", "git", "go", "python", "sql", "node", "js", "aws"};

print(fd.intersection(ed));

{js, node, docker, git}

3.3.2 联合

Dart 复制代码
var fd = <String>{"js", "node", "dart", "css", "html", "macos", "docker", "git"};
var ed = <String>{"linux", "docker", "git", "go", "python", "sql", "node", "js", "aws"};

print(fd.union(ed));

{js, node, dart, css, html, macos, docker, git, linux, go, python, sql, aws}

4. 枚举 enum

4.1 定义

适合用在常量定义,类型比较很方便

Dart 复制代码
// 定义颜色枚举值
enum ColorType {
  none,
  red,
  green,
  blue,
}

void main(List<String> args) {
  // 1 接收输入值 red 字符串
  var input = "red";

  // 2 将输入值转换为 ColorType 枚举类型
  var color = ColorType.none;
  if (input == "red") {
    color = ColorType.red;
  } else if (input == "green") {
    color = ColorType.green;
  } else if (input == "blue") {
    color = ColorType.blue;
  }

  // 3 switch 判断,打印输出
  switch (color) {
    case ColorType.red:
      print(ColorType.red);
      break;
    case ColorType.green:
      print(ColorType.green);
      break;
    case ColorType.blue:
      print(ColorType.blue);
      break;
    default:
      print(ColorType.none);
  }
}

4.2 使用场景

定义发帖类型 视频 图片 空

Dart 复制代码
enum PostType { video, image, none }

业务中判断

Dart 复制代码
  PostType get type {
    if (detail.type == POST_TYPE_IMAGE) {
      return PostType.image;
    } else if (detail.type == POST_TYPE_VIDEO) {
      return PostType.video;
    } else {
      return PostType.none;
    }
  }

  ...

  if (type == PostType.video && !_hasDetail) {
    playlist.insert(0, VideoMedia(detail));
  }

  ...

  if (type == PostType.video) {
      if (playlist.isEmpty) {
        playlist.add(VideoMedia(detail));
      } else {
        playlist.first.post = detail;
      }
    }
  } finally {
    _isLoading = false;
    if (type == PostType.video && !_hasDetail) getPostList();
  }

创作不易,希望读者三连支持 💖
赠人玫瑰,手有余香 💖

相关推荐
啊猪是的读来过倒15 小时前
Vue 全局状态管理新宠:Pinia实战指南
前端·vue.js·flutter·pinia·全局状态管理
偷野的程咬金1 天前
了解flutter中SingleTickerProviderStateMixin的使用
flutter
zhang98800002 天前
VUE的底层原理分析vue框架的来龙去脉,和技术要点及难点和应用场景,小白的进阶之道
前端·vue.js·flutter
BruceGerGer2 天前
flutter开发实战-ListWheelScrollView与自定义TimePicker时间选择器
flutter·1024程序员节
有趣的杰克2 天前
Flutter【组件】点击类型表单项
android·flutter·ios·dart
茶卡盐佑星_2 天前
VUE的基础指令介绍
前端·vue.js·flutter
张风捷特烈2 天前
FlutterUnit & TolyUI | 布局游乐场
android·flutter
长亭外的少年3 天前
深入解析三大跨平台开发框架:Flutter、React Native 和 uniapp
flutter·react native·uni-app
鳄鱼不怕_牙医不怕3 天前
Flutter 源码梳理系列(六):ProxyWidget、InheritedWidget、ParentDataWidget
flutter·源码阅读
小红星闪啊闪4 天前
Flutter的主题
前端·flutter