gpt4 book ai didi

scala - 使用泛型类型的类型进行过滤

转载 作者:行者123 更新时间:2023-12-04 17:52:34 24 4
gpt4 key购买 nike

我有以下代码(简化):

sealed trait Funding {
id: Int
}

final case class FlatRate(id: Int, days: Int, amount: BigDecimal) extends Funding
final case class PerItem(id: Int, amount: BigDecimal, discount: BigDecimal) extends Funding

final case class AppliedFunding[+A <: Funding](
person: String
)

我有一些返回“通用”AppliedFunding 列表的代码,我想获得具有正确类型的特定 AppliedFunding。伪代码:

val allFunding: List[AppliedFunding[Funding]] = <...>
val flatrateFunding: List[AppliedFunding[FlatRate]] = allFunding.someMagicFunction

代替 someMagicFunction 我正在寻找一种方法来过滤出正确的 AppliedFunding 实例并以特定类型返回它们。我可以执行 allFunding.collect { ... },但无论我尝试什么,它仍然会返回 List[AppliedFunding[Funding]]

非常感谢任何帮助。

最佳答案

下面是两种方法。补充一点:collect 是极少数情况下 PartialFunction 是好东西

sealed trait Foo
final case class Bar(i:Int) extends Foo
final case class Baz(d:Double) extends Foo

final case class Container[F <: Foo](s:String, f:F)


val all:List[Container[Foo]] = List(
Container("bar", Bar(3)),
Container("bar", Bar(4)),
Container("bar", Bar(5)),
Container("bar", Bar(6)),
Container("bar", Bar(7)),
Container("baz", Baz(1.5)),
Container("baz", Baz(2.5)),
Container("baz", Baz(3.5)),
Container("baz", Baz(4.5)),
Container("baz", Baz(5.5))
)


val bars:List[Container[Bar]] = all.collect { case Container(s, Bar(i)) => Container(s, Bar(i))}
val baz:List[Container[Baz]] = all.foldRight(List.empty[Container[Baz]]) (
(elem, lst) => elem match {
case Container(s, Baz(d)) => Container(s, Baz(d)) :: lst
case _ => lst
}
)

println(bars)
println(baz)

关于scala - 使用泛型类型的类型进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49751346/

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