gpt4 book ai didi

Scala:在一次操作中进行过滤和转换

转载 作者:行者123 更新时间:2023-12-01 09:55:24 26 4
gpt4 key购买 nike

给定异构序列,我如何才能只提取特定类型的成员,并以类型安全的方式对这些成员进行操作?

如果我有:

trait Foo
case class Bar(baz: String)
case class Qux(bar: Bar, quux: String) extends Foo
case class Corge(grault: Int) extends Foo

如果我想采用这个混合的 CorgesQuxes 序列...

val s = Seq[Foo](Corge(1), Qux(Bar("2"), "3"), Qux(Bar("4"), "5"), Corge(6), Qux(Bar("2"), "7"))

...然后只取出 Quxes,按 Bar 分组:

Map(
Bar(2) -> List(Qux(Bar(2),3), Qux(Bar(2),7)),
Bar(4) -> List(Qux(Bar(4),5))
)

我能做到:

s filter { f => f.isInstanceOf[Qux] } groupBy { 
f => f.asInstanceOf[Qux].bar }

或者我可以这样做:

(s.filter({ f => f.isInstanceOf[Qux] }).asInstanceOf[Seq[Qux]]) groupBy { 
q => q.bar }

但无论哪种方式,我都需要两次 instanceOf 检查,而我似乎应该能够摆脱一次。或者没有。是否缺少一些巧妙的模式匹配解决方案?

最佳答案

比 Daniel Martin 的解决方案更好的是使用 collect:

val a: Seq[Any] = List(1, 2, "asdf", 4)
a: Seq[Any] = List(1, 2, asdf, 4)

val b = a collect { case s: String => s }
b: Seq[String] = List(asdf)

关于Scala:在一次操作中进行过滤和转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22210905/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com