我可以使用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]));
Harry Terkel.. 5
你得到null
你的结果,因为如果s
是Iterable
你正在做的xs..add(xs.addAll(flattenWithFold1(s))
。addAll
是一种void
方法,但是由于您将其用作表达式,因此返回null
。因此,您要向中添加展平的元素xs
,然后再添加null
,这是void
方法的返回值。
你得到null
你的结果,因为如果s
是Iterable
你正在做的xs..add(xs.addAll(flattenWithFold1(s))
。addAll
是一种void
方法,但是由于您将其用作表达式,因此返回null
。因此,您要向中添加展平的元素xs
,然后再添加null
,这是void
方法的返回值。