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
相关产品推荐
相关产品推荐

