Scala中Seq.orElse输出异常:返回函数而非期望的Seq实例
为什么
Seq(0).orElse(Seq(1))返回偏函数,以及如何实现你要的兜底逻辑 问题根源
你碰到的这个现象,核心原因是Scala的Seq trait混入了PartialFunction[Int, A]——简单来说,Scala允许把序列当作一个“从索引值(Int)映射到对应元素”的偏函数来使用。所以当你调用Seq(0).orElse(Seq(1))时,你实际上调用的是PartialFunction接口里的orElse方法,这个方法的作用是合并两个偏函数(当第一个偏函数不处理某个输入时,用第二个偏函数兜底),返回的自然是一个新的偏函数,而不是你期望的序列。
你尝试Seq(0).apply.orElse(Seq(1))报错,是因为apply是Seq的实例方法,必须传入索引参数才能执行,你直接引用方法名而不调用它,编译器当然会提示缺少参数列表,这和你之前猜测的“语法糖调用apply”不是一回事~
实现你想要的空序列兜底效果
如果你想实现「当原序列为空时返回备选序列,否则返回原序列」的逻辑,最直接的方式是给Seq写一个扩展方法:
// 定义隐式扩展类,给所有Seq添加自定义的兜底逻辑 implicit class SeqWithFallback[A](val seq: Seq[A]) extends AnyVal { // 用传名参数=> Seq[A]实现懒加载,避免不必要的计算 def orElseFallback(alt: => Seq[A]): Seq[A] = if (seq.isEmpty) alt else seq }
现在测试一下,完全符合你的预期:
Seq.empty.orElseFallback(Seq(1)) // 结果: Seq(1) Seq(0).orElseFallback(Seq(1)) // 结果: Seq(0)
这样就完美解决了你的需求~
内容的提问来源于stack exchange,提问作者WeiChing 林煒清
相关产品推荐
相关产品推荐

