Dart 中 List take() 与 getRange() 有什么区别

问题描述 投票:0回答:2

我想要一些 List 的前

n
元素。据我所知,我有两个选择:
take(n)
getRange(0, n)

  1. 它们有什么区别?
  2. 我什么时候会使用一个而不是另一个(假设我总是想要第一个n元素)?
list flutter dart collections
2个回答
57
投票

最明显的区别是

take()
只能在开头使用元素,但您可以将其与
skip()
结合使用,如
list.skip(3).take(5)
以获得类似的行为。
list.take()
是惰性评估的,它适用于函数式编程,并且如果稍后不实际迭代元素,则可能会更有效。
当列表中的元素没有要求的那么多时,
list.take()
也可以容忍。
take()
返回尽可能多的可用值,
getRange()
抛出。
take()
适用于所有可迭代对象(也包括流),
getRange()
默认情况下仅在列表上可用。


0
投票

好问题! Dart 中的

take(n)
getRange(0, n)
都可以用来获取列表的第一个
n
元素,但是它们在行为和用法上有一些差异:

take(n)

  • 返回 Iterable
    take(n)
    方法返回一个
    Iterable
    ,其中包含列表的前
    n
    元素。
  • 惰性求值:它使用惰性求值,这意味着它不会立即创建新列表。相反,它创建一个可根据需要生成元素的迭代。
  • 用法:当您想要处理或迭代第一个
    n
    元素而不需要新列表时,非常理想。
void main() {
  List<int> numbers = [1, 2, 3, 4, 5];
  Iterable<int> firstThree = numbers.take(3);
  print(firstThree); // Output: (1, 2, 3)
}

getRange(start, end)

  • 返回 Iterable
    getRange(start, end)
    方法还返回
    Iterable
    ,但它允许您指定从
    start
    end
    (不包括)的元素范围。
  • 急切求值:它立即使用指定范围的元素创建一个新的可迭代对象。
  • 用法:当您需要列表中特定范围的元素而不仅仅是第一个
    n
    时很有用。
void main() {
  List<int> numbers = [1, 2, 3, 4, 5];
  Iterable<int> firstThree = numbers.getRange(0, 3);
  print(firstThree); // Output: (1, 2, 3)
}

何时使用哪个

  • 使用
    take(n)
    :当您特别需要第一个
    n
    元素并且更喜欢惰性求值时。
  • 使用
    getRange(0, n)
    :当您需要特定范围的元素并且不介意急于评估时。

就您而言,由于您总是想要第一个

n
元素,因此两种方法都可以使用。但是,如果您更喜欢惰性评估,
take(n)
可能是更好的选择。

© www.soinside.com 2019 - 2024. All rights reserved.