我正在通过Twitter的Scala学校阅读,并正在查看groupBy
和partition
收集方法。而且我不确定这两种方法之间的区别是什么。
我自己做了一些测试:
scala> List(1, 2, 3, 4, 5, 6).partition(_ % 2 == 0)
res8: (List[Int], List[Int]) = (List(2, 4, 6),List(1, 3, 5))
scala> List(1, 2, 3, 4, 5, 6).groupBy(_ % 2 == 0)
res9: scala.collection.immutable.Map[Boolean,List[Int]] = Map(false -> List(1, 3, 5), true -> List(2, 4, 6))
这是否意味着partition
返回两个列表的列表,groupBy
返回带有布尔键和列表值的Map?两者都具有相同的效果"根据条件将列表拆分为两个不同的部分。我不知道为什么我会用一个而不是另一个。那么,我什么时候使用partition
而不是groupBy
,反之亦然?
答案 0 :(得分:5)
groupBy
更适合更复杂对象的列表。
说,你有一个班级:
case class Beer(name: String, cityOfBrewery: String)
和啤酒列表:
val beers = List(Beer("Bitburger", "Bitburg"), Beer("Frueh", "Cologne") ...)
然后,您可以按cityOfBrewery
分组啤酒:
val beersByCity = beers.groupBy(_.cityOfBrewery)
现在,您可以获得自己在数据中所有城市酿造的所有啤酒的清单:
val beersByCity("Cologne") = List(Beer("Frueh", "Cologne"), ...)
干净,不是吗?
答案 1 :(得分:3)
我并不完全确定这两种方法之间的区别 是
区别在于他们的签名。 partition
期望函数A => Boolean
,而groupBy
期望函数A => K
。
在您的情况下,您使用groupBy
申请的功能似乎也是A => Boolean
,但您不希望总是这样做,有时您希望按照功能分组#39; t总是根据输入返回一个布尔值。
例如,如果您想按字符串的长度对字符串列表进行分组,则需要使用groupBy
。
那么,我何时会使用分区而不是groupBy,反之亦然?
如果您应用的函数的图像不在布尔集中,则使用groupBy
(即输入x的f(x)
产生另一个结果而不是布尔值)。如果情况并非如此,那么您可以同时使用这两种情况,无论您更喜欢Map
还是(List, List)
作为输出,都可以使用它。
答案 2 :(得分:2)
分区是指您需要根据是/否逻辑(偶数/奇数,大写/小写字母,您将其命名)将一些集合拆分为两个。 GroupBy具有更多的一般用法:基于某些功能生成许多组。我们假设你想根据他们的第一个字母(导致26个组)将单词语料库分成多个单元格,而Anything
根本不可能。