Scala 分区和groupBy之间有什么区别?

Scala 分区和groupBy之间有什么区别?,scala,Scala,我现在正在浏览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) re

我现在正在浏览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
返回一个带有布尔键和列表值的映射?两者都具有相同的“效果”,即根据条件将列表拆分为两个不同的部分。我不知道为什么我会用一个而不是另一个。那么,我什么时候会在
groupBy
上使用
partition
,反之亦然

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"), ...)
很好,不是吗

我也不确定这两种方法有什么区别 是

区别在于他们的签名
partition
需要一个函数
a=>Boolean
,而
groupBy
需要一个函数
a=>K

在您的例子中,您应用的
groupBy
函数似乎也是
A=>Boolean
,但您不希望总是这样做,有时您希望按一个函数分组,该函数并不总是根据输入返回布尔值

例如,如果要按字符串的长度对字符串列表进行分组,则需要使用
groupBy
进行分组

那么,我什么时候会在groupBy上使用分区,反之亦然


如果所应用函数的图像不在布尔集合中,则使用
groupBy
(即
f(x)
对于输入x,产生的结果不是布尔值)。如果不是这样的话,那么您可以同时使用这两种方法,这取决于您是否喜欢使用
映射
(列表,列表)
作为输出。

分区是指您需要根据是/否逻辑(偶数/奇数,大写/小写字母,您可以命名)将某个集合拆分为两个。GroupBy有更普遍的用法:基于某些函数生成许多组。假设您想根据单词的第一个字母(分为26组)将语料库拆分为多个存储箱,使用
.partition
是不可能的