加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

隐式别名和扩展scala Seq

发布时间:2020-12-16 10:03:52 所属栏目:安全 来源:网络整理
导读:我有以下内容: case class Bar()trait Foo { def bars : Seq[Bar]}case class MyFoo(bars : Seq[Bar]) extends Footrait Foos extends Seq[Foo] { def bars : Seq[Bar] = this.map(_.bars).flatten} 我想将Seq [MyFoo]的对象转换为MyFoos,最好是隐式.怎么能
我有以下内容:

case class Bar()

trait Foo {
  def bars : Seq[Bar]
}
case class MyFoo(bars : Seq[Bar]) extends Foo

trait Foos extends Seq[Foo] {
  def bars : Seq[Bar] = this.map(_.bars).flatten
}

我想将Seq [MyFoo]的对象转换为MyFoos,最好是隐式.怎么能实现这个目标?

例如.

val foos : Foos = Seq(new MyFoo(Seq(new Bar)))

解决方法

你可以这样做:

case class Bar()

  trait Foo {
    def bars : Seq[Bar]
  }
  case class MyFoo(bars : Seq[Bar]) extends Foo

  trait Foos extends Seq[Foo] {
    def bars : Seq[Bar] = this.map(_.bars).flatten
  }

  implicit def seqMyFooToMyFoos(myFoos:Seq[Foo]) = new Foos {
    def length: Int = myFoos.length

    def apply(idx: Int): Foo = myFoos(idx)

    def iterator: Iterator[Foo] = myFoos.iterator
  }

  val foos : Foos = Seq(new MyFoo(Seq(new Bar))) // Uses implicit conversion

UPDATE

这可能是您正在寻找的更多内容:

trait Foos {
    def bars : Seq[Bar]
  }

  implicit def seqMyFooToMyFoos(myFoo:Seq[MyFoo]) = new Foos {
    def bars : Seq[Bar] = myFoo.map(_.bars).flatten
  }

  val foos = Seq(new MyFoo(Seq(new Bar)))

  foos.bars

更新2

如果您使用的是scala 2.10,则可以使用隐式类并删除Foos特征:

implicit class GetAllBars(myFoo:Seq[MyFoo]) {
    def bars : Seq[Bar] = myFoo.map(_.bars).flatten
  }

  val foos = Seq(new MyFoo(Seq(new Bar)))

  foos.bars

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读