You need to enable JavaScript to run this app. Scala中将List[PropType]转换合并为List[Item]的实现方法
优惠活动
大模型
产品
解决方案
定价
更多

Scala中将List[PropType]转换合并为List[Item]的实现方法

实现方案

核心思路

通过一次遍历完成转换,全程维护两个状态:

  • 最近遇到的、未匹配到对应PropTypeB的PropTypeA实例(无匹配项时为None)
  • 已配对成功的Item列表

遍历每个元素的处理逻辑完全匹配需求规则:

  • 遇到PropTypeA时,直接覆盖当前待匹配的PropTypeA,自动丢弃上一个未完成匹配的实例
  • 遇到PropTypeB时,若存在待匹配的PropTypeA则配对生成Item加入结果列表,同时清空待匹配状态;否则直接跳过该零散PropTypeB

代码实现

函数式实现(不可变状态)

def convert(props: List[PropType]): List[Item] = {
  props.foldLeft((Option.empty[PropTypeA], List.empty[Item])) { 
    case ((pendingA, items), prop) =>
      prop match {
        case a: PropTypeA => (Some(a), items)
        case b: PropTypeB =>
          pendingA match {
            case Some(a) => (None, items :+ Item(a, b))
            case None => (pendingA, items)
          }
      }
  }._2
}

可变状态优化版(适合大数据量场景)

避免不可变List追加的性能开销,遍历效率为O(n):

import scala.collection.mutable.ListBuffer

def convert(props: List[PropType]): List[Item] = {
  var pendingA: Option[PropTypeA] = None
  val result = new ListBuffer[Item]()
  
  props.foreach {
    case a: PropTypeA => pendingA = Some(a)
    case b: PropTypeB =>
      pendingA.foreach { a =>
        result += Item(a, b)
        pendingA = None
      }
  }
  result.toList
}

测试验证

用示例输入测试:

val input = List[PropType](
  PropTypeA("item1-propTypeA"),
  PropTypeB("item1-propTypeB"),
  PropTypeB("itemPartialXXX-propTypeB"),
  PropTypeA("itemPartialYYY-propTypeA"),
  PropTypeA("item2-propTypeA"),
  PropTypeB("item2-propTypeB")
)

println(convert(input))
// 输出:List(Item(PropTypeA(item1-propTypeA),PropTypeB(item1-propTypeB)), Item(PropTypeA(item2-propTypeA),PropTypeB(item2-propTypeB)))

完全符合预期输出。

内容的提问来源于stack exchange,提问作者levant pied

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 16:15:04