我有一些非常简单的.NET逻辑,我正在移植到Scala代码库中,我真的不知道Scala的第一件事。它包括一个LINQ查询,它通过使用匿名类型投影来展平和连接,然后分组,例如:
,对标记对象的集合进行分组。var q = things.SelectMany(t => t.Tags, (t, tag) => new { Thing = t, Tag = tag })
.GroupBy(x => x.Tag, x => x.Thing);
在Scala中看起来flatMap
可能有用,但我无法弄清楚如何通过匿名将其与groupBy
结合起来。
这种事情在Scala中是否更复杂,或者我错过了一些简单的东西?
更新:
我最终选择了:
things.flatMap(t => t.Tags.map(x => (x,t))).groupBy(x => x._1)
然后当我稍后访问我需要做的地图中的值时:
.map(x => x._2)
让群组脱离元组。
当你知道怎么做时很简单!
答案 0 :(得分:1)
对我来说,你想要做类似的事情。
case class Tag(tag:String)
case class Thing(Tags : Seq[Tag])
val things :Seq[Thing] = Seq(Thing(Seq(Tag(""))))
val q = things.map {
thing => new {
val Thing = thing
val Tags = thing.Tags
}
}.flatMap {
thingAndTags => thingAndTags.Tags.map {
tag => new {
val Thing = thingAndTags.Thing
val Tag = tag
}
}
}. groupBy {
thingAndTag => thingAndTag.Tag
}.map {
tagAndSeqOfThingAndTags =>
tagAndSeqOfThingAndTags._1 -> tagAndSeqOfThingAndTags._2.map(x => x.Thing)
}
但是在Scala中,匿名对象并不常见,但您可以使用Tuple2[T1,T2]
代替所有new { val ...}
s,
val q = things.map {
thing => ( thing->thing.Tags)
}.flatMap {
thingAndTags => thingAndTags._2.map {
tag => (thingAndTags._1, tag)
}
}.groupBy {
thingAndTag => thingAndTag._2
}.map {
tagAndSeqOfThingAndTags =>
tagAndSeqOfThingAndTags._1 -> tagAndSeqOfThingAndTags._2.map(x => x._1)
}
它与所有._1
和._2
s