Scala:写一个好用的Tree工具

一、定义IdName特质

包含Id和Name

trait Id {
  val fdId: String
}

trait Name {
  val name: String
}

trait IdName extends Id with Name

二、定义引用类(父类)

/**
 * 关联对象
 *
 * @param fdId ID
 * @param name 名字
 */
case class Relevance(fdId: String = "-", name: String = "-") extends IdName

三、定义Tree特质

包含parent和children,children使用的java版本的,你懂的scala的集合类转Json是比较痛苦的。

trait Tree extends IdName {
  val parent: Relevance
  val children: util.List[AnyRef]
}

四、创建Tree工具类

这里用伴生对象

object Tree {

  /**
   * 创建树
   *
   * @param data 数据
   * @param root 根 (fdId, parent)
   * @tparam T 类型
   * @return
   */
  def create[T <: Tree](data: Seq[T], root: (String, String) = ("root", "-1")): Seq[T] = {
    for (d <- data; if d.parent.fdId == root._2 || d.fdId == root._1) yield {
      recursionFn(data, d); d
    }
  }

  /**
   * 递归列表
   *
   * @param data   所有数据
   * @param parent 父节点
   */
  private def recursionFn[T <: Tree2](data: Seq[T], parent: T): Unit = {
    val children = data.filter(_.parent.fdId == parent.fdId)
    parent.children.addAll(children.asJava)
    children.foreach(nextChild => recursionFn(data, nextChild))
  }

}

五、使用

以组织架构树为例子

1. 定义一个 OrgTree case calss 集成 Tree特质

case class OrgTree(fdId: String, name: String, parent: Relevance, children: util.List[AnyRef]) extends Tree

2. 从数据库查询数据并转换为Tree

/**
   * 组织架构树
   *
   * @return
   */
  def tree: Future[Seq[OrgTree]] = {
    val p = Promise[Seq[OrgTree]]()
    val all = db.run(table.sortBy(_.sequence).map(d => (d.fdId, d.name, d.parent)).result)
    all onComplete {
      case Success(data) =>
        p.success(Tree.create(data map t2TreeDTO))
      case Failure(exception) =>
        p.failure(exception)
    }
    p.future
  }

  /**
   * 特质转TreeDTO
   *
   * @param t3 (fdId, name, parent)
   * @return
   */
  private def t2TreeDTO(t3: (String, String, String)): OrgTree = {
    implicit val dbRun = (id: String) => db.run(findParentCompiled(id).result.head)
    OrgTree(t3._1, t3._2, findParentByCache(t3._3), new util.ArrayList[AnyRef]())
  }

findParentByCache 是根据父类ID查询父类信息的函数

六、效果

在这里插入图片描述

查看原文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值