以下代码对我来说很好,虽然它是一个单独的功能
chunkBySize(List list, int size) => list.isEmpty
? list
: ([list.take(size)]..addAll(chunkBySize(list.skip(size), size)));
我能够顺利地称之为:
void main() {
var list = new List();
list.addAll([1,2,3]);
print(chunkBySize(list, 2));
}
但是当我试图在一个结构中使用它时,它失败了,所以我不得不写下面的方式:
import 'dart:collection';
class functionalList<E> extends ListBase<E> {
final List<E> l = []; // or List l = new List();
functionalList();
.
.
.
chunkBySize(int size) => _chunkBySize(l, size);
_chunkBySize(List list, int size) => list.isEmpty
? list
: ([list.take(size)]..addAll(_chunkBySize(list.skip(size), size)));
}
并且能够通过以下方式调用它:
void main() {
var list = new functionalList();
list.addAll([1,2,3]);
print(list.chunkBySize(2));
}
有没有办法在班级男孩中简化它,即用单一陈述替换下面的内容:
chunkBySize(int size) => _chunkBySize(l, size);
_chunkBySize(List list, int size) => list.isEmpty
? list
: ([list.take(size)]..addAll(_chunkBySize(list.skip(size), size)));
答案 0 :(得分:0)
您可以在chunkBySize
方法中声明本地帮助程序函数。
class FunctionalList<E> extends ListBase<E> {
...
List<Iterable<E>> chunkBySize(int size) {
List<Iterable<E>> helper(Iterable<E> list, int size) => list.isEmpty
? const []
: ([list.take(size)]..addAll(_chunkBySize(list.skip(size), size);
return helper(this, size);
}
}
我没有发现这比具有外部帮助功能更具可读性,但在这种情况下,它实际上为您提供了更好的输入。
我可能会把这个函数写成:
List<Iterable<E>> chunkBySize(int size) {
List<Iterable<E>> result = [];
for (int i = 0; i < this.length; i += size) {
result.add(this.getRange(i, min(i + size, this.length)));
}
return result;
}
既易于阅读又更有效率。
重复callas addAll
的递归函数将具有原始列表长度的二次方的时间复杂度,因为它不断将元素从一个列表复制到另一个列表。