设计 – 为什么Scala维护的集合类型不返回Iterable(如.Net)?
在
Scala中,你可以做到
val l = List(1,2,3) l.filter(_ > 2) // returns a List[Int] val s = Set("hello","world") s.map(_.length) // returns a Set[Int] 问题是:为什么这有用? Scala集合可能是唯一执行此操作的现有集合框架. Scala社区似乎同意需要此功能.然而,似乎没有人会错过其他语言的这种功能.示例C#(修改命名以匹配Scala): var l = new List<int> { 1,3 } l.filter(i => i > 2) // always returns Iterable[Int] l.filter(i => i > 2).toList // if I want a List,no problem l.filter(i => i > 2).toSet // or I want a Set 在.NET中,我总是得到一个Iterable,这取决于我想用它做什么. (这也使.NET集合非常简单). 使用Set的Scala示例强制我从一组字符串中创建一组长度.但是,如果我只想迭代长度,或构建长度列表,或保持Iterable以后过滤它,该怎么办?立即构建一个集合似乎毫无意义. (编辑:collection.view提供更简单的.NET功能,很好) 我相信你会向我展示.NET方法绝对错误或杀死性能的例子,但我看不到任何问题(使用.NET多年). 解决方法
对你的问题不是一个完整的答案,但Scala从不强迫你使用一种集合类型而不是另一种集合类型.你可以自由编写这样的代码:
import collection._ import immutable._ val s = Set("hello","world") val l: Vector[Int] = s.map(_.length)(breakOut) 阅读有关Daniel Sobral’s detailed answer中breakOut的更多信息. 如果您希望懒惰地评估地图或过滤器,请使用以下命令: s.view.map(_.length) 这整个行为使您可以轻松集成新的集合类并继承标准集合的所有强大功能而无需代码重复,所有这些都确保了YourSpecialCollection#filter返回YourSpecialCollection的实例;如果YourSpecialCollection #map支持映射到的类型,则返回YourSpecialCollection的实例;如果不支持,则返回内置的回退集合(就像在BitSet上调用map一样).当然,C#迭代器没有.toMySpecialCollection方法. 另见:“集成新集和地图”于The Architecture of Scala Collections. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |