partition和groupBy有什么区别?

时间:2015-07-24 18:56:27

标签: scala

我正在通过Twitter的Scala学校阅读,并正在查看groupBypartition收集方法。而且我不确定这两种方法之间的区别是什么。

我自己做了一些测试:

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,反之亦然?

3 个答案:

答案 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根本不可能。