【Flutter 开发实战】Dart 基础篇:List 详解

发布时间:2024年01月14日

在这里插入图片描述

嗨,各位朋友们,欢迎来到这篇博客!今天我们将一起踏入 Dart 语言的神奇世界,深入了解 Dart 中的 List 类型。不用担心,我会尽可能用最通俗易懂的语言,让你对 List 有一个更深刻的理解。

Dart 中的 List

List - 让数据变得有趣!

在 Dart 语言中,List 就像一个神奇的盒子,可以放进去各种各样的东西,比如数字、文字,甚至是其他盒子(List)!今天,我们就来揭开 List 的神秘面纱,看看它是如何让数据变得有趣的。

在这里插入图片描述

// 创建一个充满数字的盒子
List<int> numbers = [1, 2, 3, 4, 5];

// 创建一个装满水果的盒子
List<String> fruits = ['apple', 'banana', 'orange'];

咦,看起来好像挺简单的吧?方括号里面放东西,逗号分隔,就是一个 List 了!

List 的小魔法

获取盒子的长度
List<int> numbers = [1, 2, 3, 4, 5];
int length = numbers.length;

print('盒子里有多少东西呢?答案是:$length 个!'); // 输出:盒子里有多少东西呢?答案是:5 个!

嘿,这个 length 就像是盒子的秘密标签,告诉你里面到底有多少东西。

拿出盒子里的东西
List<String> fruits = ['apple', 'banana', 'orange'];
String firstFruit = fruits[0];

print('盒子里的第一样东西是什么呢?是:$firstFruit'); // 输出:盒子里的第一样东西是什么呢?是:apple

哎呀,索引就像是盒子的小抽屉,从 0 开始,想拿出哪个就说出它的位置,比如 fruits[0] 就是拿出第一个水果。

往盒子里加新东西
List<String> fruits = ['apple', 'banana', 'orange'];
fruits.add('grape');

print('往盒子里加了一颗葡萄,现在是这样的:$fruits'); // 输出:往盒子里加了一颗葡萄,现在是这样的:[apple, banana, orange, grape]

fruits 盒子里原本有 apple、banana、orange,来了一颗新水果 grape,用 add 方法就能轻松加入盒子。

从盒子里拿掉东西
List<String> fruits = ['apple', 'banana', 'orange'];
fruits.remove('banana');

print('把香蕉拿出去了,盒子里现在是这样的:$fruits'); // 输出:把香蕉拿出去了,盒子里现在是这样的:[apple, orange]

remove 方法,就像把盒子里的东西拿出来一样,轻松又方便。

盒子漫游之遍历

遍历就像是打开盒子,逐个看看里面有什么,这可是盒子漫游的时刻!

for 循环遍历
List<int> numbers = [1, 2, 3, 4, 5];
for (int number in numbers) {
  print('这个数字是啥呢?是:$number');
}

for 循环,一个个数字出来亮相,好像数字们在做小秀一样。

forEach 方法遍历
List<String> fruits = ['apple', 'banana', 'orange'];
fruits.forEach((fruit) {
  print('这个水果是啥呢?是:$fruit');
});

forEach 方法更简单,像是盒子里的每个东西都过来和你打招呼,一点都不会掉队。

不得不说,List 可真是个有趣的小伙伴,让我们的数据变得生动起来!

List 的小秘密

在 Dart 的舞台上,List 扮演着一个神奇的角色,但在使用它的过程中,可能会遇到一些小问题。让我们一一解决这些谜题吧!

如何判断 List 是否为空?
List<String> fruits = [];
if (fruits.isEmpty) {
  print('哎呀,水果盒子空空如也!');
} else {
  print('水果盒子里有${fruits.length}种水果哦!');
}

通过 isEmpty 属性,我们可以轻松地判断 List 是否为空,就像翻开水果盒子看看里面有没有惊喜。

如何查找 List 中的最大值和最小值?
List<int> numbers = [10, 5, 8, 15, 3];
int maxNumber = numbers.reduce((value, element) => value > element ? value : element);
int minNumber = numbers.reduce((value, element) => value < element ? value : element);

print('最大值是:$maxNumber,最小值是:$minNumber');

通过使用 reduce 方法,我们可以像找宝藏一样,找到 List 中的最大值和最小值。

List 的进阶冒险

现在,让我们进入一些高级的 List 冒险,让你的 Dart 旅程更加丰富多彩。

使用 map 转换 List 中的元素
List<int> numbers = [1, 2, 3, 4, 5];
List<int> squaredNumbers = numbers.map((number) => number * number).toList();

print('原始数字列表:$numbers');
print('每个数字的平方列表:$squaredNumbers');

map 方法就像是 List 的魔法师,可以将每个元素进行转换,创造出一个全新的 List。

使用 where 过滤 List 中的元素
List<int> numbers = [1, 2, 3, 4, 5];
List<int> evenNumbers = numbers.where((number) => number % 2 == 0).toList();

print('原始数字列表:$numbers');
print('偶数列表:$evenNumbers');

where 方法就像是一位聪明的导游,可以根据你的喜好,为你筛选出特定的元素。

使用 sort 对 List 进行排序
List<int> numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5];
numbers.sort();

print('排序后的数字列表:$numbers');

sort 方法就像是整理房间,可以按照顺序排列,让一切井然有序。

使用 contains 判断 List 是否包含某个元素
List<String> fruits = ['apple', 'banana', 'orange'];
bool containsBanana = fruits.contains('banana');

if (containsBanana) {
  print('水果盒子里有香蕉哦!');
} else {
  print('水果盒子里没有香蕉。');
}

contains 方法就像是查找宝藏的探险者,可以告诉你是否在 List 中找到了特定的元素。

List 的奇妙嵌套

在 Dart 的舞台上,List 可以变得更加神奇,通过嵌套,你可以创建更复杂的数据结构。

在这里插入图片描述

List<List<int>> matrix = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
];

print('矩阵的第二行:${matrix[1]}');

这就像是在盒子里装盒子,通过嵌套,我们可以创建出更有趣的数据结构。

使用 List 的小心事项

在使用 List 的冒险中,一些小心事项也需要我们注意。

List 是可变的

在 Dart 中,List 是一位非常随和的小伙伴,你可以随时添加、删除或修改其中的元素。但别忘了,有时候要小心,避免意外发生。

List<int> numbers = [1, 2, 3, 4, 5];
numbers[0] = 10;

print('修改后的数字列表:$numbers');

通过索引,我们可以直接修改 List 中的元素值,就像给小伙伴们换了新衣服一样。

避免空指针异常

在冒险的过程中,千万要确保不要走进“越界”的陷阱,以免出现空指针异常。

List<String> fruits = ['apple', 'banana', 'orange'];

if (fruits.length > 2) {
  print('第三个水果是:${fruits[2]}');
} else {
  print('水果盒子里没有第三个水果。');
}

在这个例子中,我们先判断盒子的大小,再去取第三个元素,确保一切安全。

Dart 中 List 的其他花样

除了上面的操作,List 在 Dart 中还有更多花样,比如在函数中传递多个参数、实现队列和栈等。

使用 List 传递多个参数
void printNumbers(List<int> numbers) {
  for (int number in numbers) {
    print(number);
  }
}

printNumbers([1, 2, 3, 4, 5]);

通过将参数声明为 List 类型,我们可以方便地一次传递多个值给函数,就像给朋友送上一箱好吃的糖果。

实现队列和栈
// 队列(先进先出)
Queue<int> queue = Queue();
queue.addAll([1, 2, 3, 4, 5]);

int firstElement = queue.removeFirst();
print('队列的第一个元素是:$firstElement');

// 栈(后进先出)
List<int> stack = [];
stack.addAll([1, 2, 3, 4, 5]);

int lastElement = stack.removeLast();
print('栈的最后一个元素是:$lastElement');

通过使用 Dart 中的 Queue 类和 List 的 removeFirstremoveLast 方法,我们可以模拟队列和栈的玩法,就像在玩游戏一样。

在 Dart 的大舞台上,List 是个多才多艺的演员,有了这些花样,你就能更自如地编写出丰富多彩的代码了!

List 魔法手册

在 Dart 的大舞台上,List 扮演着一个强大而灵活的角色。上面的部分我们介绍了 Dart 中 List 的常见用法,但在 Dart 中还有其它的一些属性和用法,接下来,就让我们一起来总结 List 的一些神奇属性和方法吧!

List 常用属性:

属性描述
length获取 List 的长度
reversed翻转 List 中的元素
isEmpty判断 List 是否为空
isNotEmpty判断 List 是否不为空
1. length - 长度

length 属性用于获取 List 的长度,即 List 中元素的个数。

List<int> numbers = [1, 2, 3, 4, 5];
int length = numbers.length;

print('List 的长度是:$length'); // 输出:List 的长度是:5

这个属性非常简单,但在很多场景中都是必不可少的。

2. reversed - 翻转

reversed 属性用于将 List 中的元素翻转。

List<int> numbers = [1, 2, 3, 4, 5];
List<int> reversedNumbers = numbers.reversed.toList();

print('翻转后的数字列表:$reversedNumbers');

这样我们就能得到一个反向排列的 List。

3. isEmpty - 是否为空

isEmpty 属性用于判断 List 是否为空,返回一个布尔值。

List<String> fruits = [];
if (fruits.isEmpty) {
  print('水果列表为空!');
} else {
  print('水果列表不为空,有${fruits.length}种水果。');
}

这是一个常见的判断,以避免在空列表上执行不必要的操作。

4. isNotEmpty - 是否不为空

相应地,isNotEmpty 属性则判断 List 是否不为空,也返回一个布尔值。

List<String> fruits = ['apple', 'banana', 'orange'];
if (fruits.isNotEmpty) {
  print('水果列表不为空,有${fruits.length}种水果。');
} else {
  print('水果列表为空!');
}

这两个属性在条件判断中经常被用到。

List 常用方法:

方法描述
add向 List 的末尾添加一个元素
addAll将一个 List 中的所有元素添加到另一个 List 的末尾
indexOf查找 List 中某个特定值的索引,如果未找到则返回 -1
remove删除 List 中指定值的第一个匹配项
removeAt删除 List 中指定索引位置的元素
fillRange修改 List 中一定范围内的元素值
insert在 List 的指定位置插入一个元素
insertAll在 List 的指定位置插入另一个 List 中的所有元素
toList将其他类型的集合转换为 List
join将 List 中的元素连接成一个字符串,可以指定连接符
split将一个字符串按照指定的分隔符拆分成 List
forEach遍历 List 中的每个元素,对每个元素执行指定的操作
map对 List 中的每个元素执行指定的操作,并返回一个新的 List
where根据指定的条件过滤 List 中的元素,返回一个新的 List
any检查 List 中是否至少有一个元素满足指定的条件,返回一个布尔值
every检查 List 中是否所有元素都满足指定的条件,返回一个布尔值
1. add - 增加

add 方法用于向 List 的末尾添加一个元素。

List<String> fruits = ['apple', 'banana', 'orange'];
fruits.add('grape');

print('添加葡萄后的水果列表:$fruits');

这是一个简单而常见的操作,用于动态地向 List 中添加元素。

2. addAll - 拼接数组

addAll 方法用于将一个 List 中的所有元素添加到另一个 List 的末尾。

List<int> numbers1 = [1, 2, 3];
List<int> numbers2 = [4, 5, 6];
numbers1.addAll(numbers2);

print('拼接后的数字列表:$numbers1');

这是一个很方便的方法,可以将两个 List 合并成一个。

3. indexOf - 查找

indexOf 方法用于查找 List 中某个特定值的索引,如果未找到则返回 -1。

List<String> fruits = ['apple', 'banana', 'orange'];
int indexOfBanana = fruits.indexOf('banana');

print('香蕉的索引是:$indexOfBanana'); // 输出:香蕉的索引是:1

通过这个方法,我们可以迅速找到某个元素在 List 中的位置。

4. remove - 删除

remove 方法用于删除 List 中指定值的第一个匹配项。

List<String> fruits = ['apple', 'banana', 'orange'];
fruits.remove('banana');

print('去掉香蕉后的水果列表:$fruits');

使用这个方法可以轻松地从 List 中移除指定的元素。

5. removeAt - 删除

removeAt 方法用于删除 List 中指定索引位置的元素。

List<String> fruits = ['apple', 'banana', 'orange'];
fruits.removeAt(1);

print('去掉索引为1的水果后的水果列表:$fruits');

这个方法对于根据索引值删除元素非常有用。

6. fillRange - 修改

fillRange 方法用于修改 List 中一定范围内的元素值。

List<int> numbers = [1, 2, 3, 4, 5];
numbers.fillRange(1, 3, 10);

print('修改范围后的数字列表:$numbers');

这个方法让我们可以在 List 中指定范围内进行批量修改。

7. insert - 指定位置插入

insert 方法用于在 List 的指定位置插入一个元素。

List<String> fruits = ['apple', 'banana', 'orange'];
fruits.insert(1, 'grape');

print('在索引1处插入葡萄后的水果列表:$fruits');

通过这个方法,我们可以灵活地在 List 中的任意位置插入元素。

8. insertAll - 指定位置插入 List

insertAll 方法用于在 List 的指定位置插入另一个 List 中的所有元素。

List<String> fruits = ['apple', 'banana', 'orange'];
fruits.insertAll(1, ['grape', 'kiwi']);

print('在索引1处插入葡萄和猕猴桃后的水果列表:$fruits');

这个方法对于批量插入元素非常方便。

9. toList - 其他类型转换成 List

toList 方法用于将其他类型的集合(如 Set)转换为 List。

Set<int> uniqueNumbers = {1, 2, 3, 4, 5};
List<int> numbersList = uniqueNumbers.toList();

print('Set 转换成 List 后的数字列表:$numbersList');

这个方法对于在不同集合类型之间进行转换很有用。

10. join - List 转换成字符串

join 方法用于将 List 中的元素连接成一个字符串,可以指定连接符。

List<String> fruits = ['apple', 'banana', 'orange'];
String fruitString = fruits.join(', ');

print('水果列表转换成字符串:$fruitString');

通过这个方法,我们可以方便地将 List 转换为可读性更好的字符串。

11. split - 字符串转化成 List

split 方法用于将一个字符串按照指定的分隔符拆分成 List。

String fruitsString = 'apple,banana,orange';
List<String> fruitsList = fruitsString.split(',');

print('字符串转换成水果列表:$fruitsList');

这个方法在处理从文件或网络获取的逗号分隔的数据时非常实用。

12. forEach

forEach 方法用于遍历 List 中的每个元素,对每个元素执行指定的操作。

List<int> numbers = [1, 2, 3, 4, 5];
numbers.forEach((number) {
  print('当前数字是:$number');
});

这是一种简洁的方式来遍历 List。

13. map

map 方法用于对 List 中的每个元素执行指定的操作,并返回一个新的 List。

List<int> numbers = [1, 2, 3, 4, 5];
List<int> squaredNumbers = numbers.map((number) => number * number).toList();

print('原始数字列表:$numbers');
print('每个数字的平方列表:$squaredNumbers');

通过这个方法,我们可以方便地对 List 进行转换。

14. where

where 方法用于根据指定的条件过滤 List 中的元素,返回一个新的 List。

List<int> numbers = [1, 2, 3, 4, 5];
List<int> evenNumbers = numbers.where((number) => number % 2 == 0).toList();

print('原始数字列表:$numbers');
print('偶数列表:$evenNumbers');

这是一种强大的方法,可以根据需要筛选 List 中的元素。

15. any

any 方法用于检查 List 中是否至少有一个元素满足指定的条件,返回一个布尔值。

List<int> numbers = [1, 2, 3, 4, 5];
bool hasEvenNumber = numbers.any((number) => number % 2 == 0);

if (hasEvenNumber) {
  print('列表中有偶数。');
} else {
  print('列表中没有偶数。');
}

这个方法对于检查是否存在符合条件的元素很有用。

16. every

every 方法用于检查 List 中是否所有元素都满足指定的条件,返回一个布尔值。

List<int> numbers = [2, 4, 6, 8, 10];
bool allEvenNumbers = numbers.every((number) => number % 2 == 0);

if (allEvenNumbers) {
  print('列表中所有数字都是偶数。');
} else {
  print('列表中至少有一个不是偶数。');
}

这个方法对于检查是否所有元素都满足条件很有用。

结语

通过这篇博客,我们深入探讨了 Dart 中 List 的方方面面。从基本操作到高级应用,希望你现在对 Dart 中的 List 有了更清晰的认识。

  • 我们学习了如何创建、访问和操作 List。
  • 了解了如何遍历 List,并解决了一些常见问题。
  • 探讨了一些高级操作,包括转换、过滤和排序。
  • 知道了 List 可以嵌套,用于处理更复杂的数据结构。
  • 注意了在使用 List 时的一些小细节,避免了一些常见错误。

希望通过这篇博客,你对 Dart 中的 List 有了更深入的理解。在你的 Dart 之旅中,List 将是一个非常有力的工具,帮助你处理各种数据。加油,各位朋友们,愿你们在 Dart 的世界中越走越远!

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191
文章来源:https://blog.csdn.net/qq_21484461/article/details/135577922
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。