【问题标题】:How to return a dart list without creating another list inside the function?如何返回飞镖列表而不在函数内创建另一个列表?
【发布时间】:2021-11-05 02:53:50
【问题描述】:
List<int> getNumbers() {
  List<int> numbers = [];
  for (int i = 0; i < 100; i++) {
    numbers.add(i);
  }
  return numbers;
}

我想返回一个整数列表,但列表本身是使用循环生成的,那么有没有办法直接返回循环的值而不创建另一个列表来存储每次迭代的值?

【问题讨论】:

  • 如果要返回多个值,则需要以某种方式存储它们。因此,要一次将它们全部归还,您需要将它们存储在某种集合中(通常是List)。如果您希望一次懒惰地返回一个值并让调用者请求下一个值,您可以使用generator function。
  • 如果用例确实是您编写的,您可以使用return list.generate(100, (index) =&gt; index); 并为自己保存 for 循环,但您无法保存列表。

标签: list function dart


【解决方案1】:

我并不完全清楚您的要求。 您想返回一个列表,但又不想创建一个列表。

您没有在函数内创建 另一个 列表。您正在创建 列表,然后返回该列表。只有一个列表在起作用。

但是,你也可以用不同的方式来写。

首先,你的函数应该是一个名为numbers、not a function named getNumbers的getter。

您还可以在单​​个表达式中创建列表:

 [for (var i = 0; i < 100; i++) i]

你可以做的不同是返回一个可迭代对象:

Iterable<int> get numbers sync* {
  for (var i = 0; i < 100; i++) {
    yield i;
  }
}

这根本不会创建一个列表。

或者,如果您不想每次都创建一个新列表,请将其缓存:

List<int>? _numbers;
List<int> get numbers() => _numbers ??= [
  for (var i = 0; i < 100; i++) i
];

或者只是

final List<int> numbers = [
  for (var i = 0; i < 100; i++) i
];

这将只创建一个列表,并在您每次请求时重用它(这可能是一个问题,因为列表是可变的,所以只有在您相信读者不会修改列表时才这样做!)

【讨论】:

    【解决方案2】:

    您可以创建一个 getter,直接使用 List 生成函数返回数字列表,例如

    List<int> get getNumbers => List.generate(100, (index) => index + 1);
    

    或者使用方法

    List<int> getNumbers() {
      return List.generate(100, (index) => index + 1);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-15
      • 1970-01-01
      • 2020-11-27
      • 2020-07-13
      • 1970-01-01
      • 2019-07-09
      • 1970-01-01
      相关资源
      最近更新 更多