如何在 Dart 中仅使用级联或链式调用干净地映射/排序/折叠/排序/扩展?

Posted

技术标签:

【中文标题】如何在 Dart 中仅使用级联或链式调用干净地映射/排序/折叠/排序/扩展?【英文标题】:How do I cleanly map / sort / fold / sort / expand using only cascades or chained calls, in Dart? 【发布时间】:2013-12-08 07:16:08 【问题描述】:

我想对一个源列表执行以下操作:

地图 到列表 排序 折叠 排序 展开 到列表

其中一些方法,如 map 和 toList 是可链接的,因为它们返回一个非空对象。但是,sort 方法返回 void,因为它对 List 进行操作,而不返回列表。

Dart 有一个 method cascade operator,它非常适用于不返回 this 或其他对象的方法调用。

如果不求助于在 sort 之后分配一个变量然后再次启动调用链,我很难编写上述调用序列。

我想写相当于:

return thing
         .map(...)
         .toList()
         .sort(...)
         .fold(...)
         .sort(...)
         .expand(...)
         .toList();

我能得到的最接近的是:

var thing
      .map(...)
      .toList()
        ..sort(...);

var otherThing = thing
                   .fold(...)
                     ..sort(...);

var finalThing = otherThing.expand(...).toList();

有没有更好的方法?我如何“突破”级联并继续上链?

【问题讨论】:

有一个关于这个主题的问题:Move sort to Iterable, return an iterable (instead of changing the collection in place). 【参考方案1】:

你能添加一些括号吗?我猜是这样的......

return ((thing
         .map(...)
         .toList()..sort(...))
           .fold(...)..sort(...))
             .expand(...)
             .toList();

【讨论】:

@Nican - 回滚您的编辑,因为 Seth 知道方法级联。他在他的问题中使用它们。 问这个问题的人是;另一位阅读该问题的读者(如我 5 分钟前)没有。 好的 - 我更新了 Seth 的问题以添加指向本文的链接。 news.dartlang.org/2012/02/… 我用链接更新了帖子。感谢您的澄清。 谢谢@GregLowe。我希望我们有一个返回列表的排序,它会让这更容易。

以上是关于如何在 Dart 中仅使用级联或链式调用干净地映射/排序/折叠/排序/扩展?的主要内容,如果未能解决你的问题,请参考以下文章

java链式编程/级联式编程

如何干净地使用:const char* 和 std::string?

掌握如何让函数更好地调用

掌握如何让函数更好地调用

掌握如何让函数更好地调用

链式CNI插件与portmap端口映射