.cast() 和 List.from() 和 List.castFrom() 有什么区别
What is the difference among .cast() and List.from() and List.castFrom()
列出 foo -> 列出 bar
我可以使用三种方法
1.List<MyClass> bar = foo.cast<MyClass>()
2.List<MyClass> bar = List.castFrom(foo)
3.List<MyClass> bar = List.from(foo)
有什么区别?
附加问题的答案(“任何实际差异(不仅仅是 quoting/sharing 文档)关于何时工作而另一个失败将不胜感激。”):
当你有一个 giant 数组时,复制它 (List.from
) 将不是一个聪明的主意 - 你将花费大量时间复制所有内容并且它会也花费了你很多记忆。相反,您需要使用 List.cast
,它只会 return 一个 view 而不会复制列表中的所有内容。在这种情况下 List.cast
会工作而其他人会失败。确实,不是失败,而是不好。
由于“[List.cast] 通常实现为 List.castFrom(this)”,上述示例也适用于 List.castFrom
。
至于什么时候我们应该使用List.from
而不是其他两个,请考虑以下情况:您有列表a
,并且想将其复制到列表b
并且对 b
进行一些修改。如果只想修改b
,而想让a
保留原来的,应该用List.from
复制(克隆),而不是List.cast
.
简而言之:List.cast
几乎与 List.castFrom
相同。他们都不复制任何东西。 List.from
复制所有内容。
确实也可以看看源码:static List<T> castFrom<S, T>(List<S> source) => CastList<S, T>(source);
而CastList
实现为:
abstract class _CastListBase<S, T> extends _CastIterableBase<S, T>
with ListMixin<T> {
List<S> get _source;
T operator [](int index) => _source[index] as T;
...
}
class CastList<S, T> extends _CastListBase<S, T> {
...
}
所以,你可以很清楚地看到,当你做cast
(或castFrom
)时,你并没有复制和创建一个新列表,而只是做了一个非常薄的包装。该包装器将在您使用它时进行类型转换。
列出 foo -> 列出 bar
我可以使用三种方法
1.List<MyClass> bar = foo.cast<MyClass>()
2.List<MyClass> bar = List.castFrom(foo)
3.List<MyClass> bar = List.from(foo)
有什么区别?
附加问题的答案(“任何实际差异(不仅仅是 quoting/sharing 文档)关于何时工作而另一个失败将不胜感激。”):
当你有一个 giant 数组时,复制它 (List.from
) 将不是一个聪明的主意 - 你将花费大量时间复制所有内容并且它会也花费了你很多记忆。相反,您需要使用 List.cast
,它只会 return 一个 view 而不会复制列表中的所有内容。在这种情况下 List.cast
会工作而其他人会失败。确实,不是失败,而是不好。
由于“[List.cast] 通常实现为 List.castFromList.castFrom
。
至于什么时候我们应该使用List.from
而不是其他两个,请考虑以下情况:您有列表a
,并且想将其复制到列表b
并且对 b
进行一些修改。如果只想修改b
,而想让a
保留原来的,应该用List.from
复制(克隆),而不是List.cast
.
简而言之:List.cast
几乎与 List.castFrom
相同。他们都不复制任何东西。 List.from
复制所有内容。
确实也可以看看源码:static List<T> castFrom<S, T>(List<S> source) => CastList<S, T>(source);
而CastList
实现为:
abstract class _CastListBase<S, T> extends _CastIterableBase<S, T>
with ListMixin<T> {
List<S> get _source;
T operator [](int index) => _source[index] as T;
...
}
class CastList<S, T> extends _CastListBase<S, T> {
...
}
所以,你可以很清楚地看到,当你做cast
(或castFrom
)时,你并没有复制和创建一个新列表,而只是做了一个非常薄的包装。该包装器将在您使用它时进行类型转换。