Dart 折叠列表

Dart 折叠列表,dart,Dart,我可以用fold将列表展平 flattenWithFold(Iterable list) => list.fold([], (List xs, s) { s is Iterable ? xs.addAll(flattenWithFold(s)) : xs.add(s); return xs; }); 执行时 print(flattenWithFold([1,[3,5,[1,2]],[2,1],6])); 它产生正确的结果[1,3,5,1,2,2,1,6] 但当我试图重构以使用.

我可以用fold将列表展平

flattenWithFold(Iterable list) => list.fold([], (List xs, s) {
s is Iterable ? xs.addAll(flattenWithFold(s)) : xs.add(s);
   return xs;
});
执行时

print(flattenWithFold([1,[3,5,[1,2]],[2,1],6])); 
它产生正确的结果[1,3,5,1,2,2,1,6]

但当我试图重构以使用..add时,它会产生错误的结果

flattenWithFold1(Iterable list) => list.fold([], (List xs, s) => xs..add(
              s is Iterable ? xs.addAll(flattenWithFold1(s)) : s));
有人能解释一下为什么执行时会出现null[1,3,5,1,2,null,null,2,1,null,6]吗

print(flattenWithFold1([1,[3,5,[1,2]],[2,1],6]));

您在结果中得到的是
null
,因为如果
s
Iterable
您正在执行
xs..add(xs.addAll(flattWithFold1(s))
addAll
是一个
void
方法,但由于您将其用作表达式,它返回
null
。因此您将展平元素添加到
xs
,但随后您添加了
null
,这是
void
方法的返回值。

感谢@Harry的解释。是否有有效的方法使用折叠而不使用返回的展平方法?提前谢谢。你只需要级联addAll。我不确定为什么折叠是一个要求,因为你也可以进行展平(Iterable list)=>list。展开((item)=>item is Iterable?展平(item):[item]);使用expand是一种有效的方法。我只是想看看是否有其他有效的方法可以使用fold。感谢@AlanI找到了一种方法
FlattWithFold(Iterable list)=>list。fold([],(list xs,s)=>s是Iterable?(xs..addAll(FlattWithFold(s)):(xs..add(s)))
构建中间列表并在之后使用它们进行添加并不是特别有效。备选方法:
\u rec(累加器,元素)=>元素是可编辑的?元素。折叠(累加器,元素):(累加器..添加(元素));平面(可编辑元素)=>\u rec([],元素);