2017-01-24 2 views
1

я смог расплющить список, используя сгибСписок Свести с складка

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])); 

ответ

4

Вы получаете null в ваш результат, потому что, если s является Iterable вы делаете xs..add(xs.addAll(flattenWithFold1(s)). addAll - метод void, но поскольку вы используете его в качестве выражения, он возвращает null. Таким образом, вы добавляете сплющенные элементы к xs, но затем вы добавляете null, что является возвращаемым значением void методов.

+0

Спасибо за пояснение @Harry. Есть ли эффективный способ сглаживания сбрасывания без использования возврата? Заранее спасибо. –

+0

Вам просто нужно каскадировать addAll. Я не уверен, почему сгиб - это требование, потому что вы также можете сгладить (список Iterable) => list.expand ((item) => item is Iterable? Flatten (item): [item]); –

+0

Использование расширения - эффективный способ. Я просто пытался понять, есть ли еще один эффективный способ сбрасывать. Спасибо @Alan –