所以。場景:foldLeft on Iterable(String,(Long,Long))
我有這樣的名單:
("USER1",(24,11))
("USER2",(10,7))
("USER2",(1,10))
("USER1",(2,3))
("USER3",(3,4))
,我需要groupBy
每一個用戶的所有信息,然後總結每一個元組的信息。
所以我預期的輸出結果是:
("USER1",(26,14))
("USER2",(11,17))
("USER3",(3,4))
我這個下面的代碼實現這一點:
userInfo.groupBy(elem => elem._1).map(_._2).map { user =>
{
val sums = user.foldLeft(("", (0L, 0L)))((acc, newElem) =>
(acc._1,
(acc._2._1 + newElem._2._1, acc._2._2 + newElem._2._2)))
}
(user._1,sums)
}
其中userInfo
是Iterable[String,(Long,Long)]
正如你所看到的,我用了一個foldLeft,我在那裏幾乎忽略了每個元組的第一個元素,因爲我並不在乎foldLeft。
我想知道,因爲我覺得它非常糟糕的代碼,基本上是因爲這個foldLeft
與一個空字符串,有沒有更好的解決方案呢?
不是一個答案,但值得注意的是,在Cats中,你可以把它寫成'userInfo.foldMap(Map(_))'。 –
@TravisBrown貓是一種語言嗎?還是我太無知了解你的評論? –
對不起,它是[Scala的一個庫](https://github.com/typelevel/cats),提供了一些抽象和有用的東西,比如'foldMap'。 –