Scala 折叠/缩小,带可能为空的序号,无零值

Scala 折叠/缩小,带可能为空的序号,无零值,scala,Scala,例如,在Slick中,DDL对象可以由以下部分组成: val t1: DDL = Table1.ddl val t2: DDL = Table2.ddl val compositeDDL = t1 ++ t2 如果我有一个DDLs序列,我想用++将它们简化为一个DDL: ddls.reduceLeft(_ ++ _) 如果序列为空,则此操作无效。但我也不能使用fold,因为我不能使用零起始值(这样的值有意义吗?) 因此,我采取了如下措施: if (ddls.isEmpty) None els

例如,在Slick中,
DDL
对象可以由以下部分组成:

val t1: DDL = Table1.ddl
val t2: DDL = Table2.ddl
val compositeDDL = t1 ++ t2
如果我有一个
DDL
s序列,我想用
++
将它们简化为一个
DDL

ddls.reduceLeft(_ ++ _)
如果序列为空,则此操作无效。但我也不能使用fold,因为我不能使用零起始值(这样的值有意义吗?)

因此,我采取了如下措施:

if (ddls.isEmpty) None else Some(ddls.reduceLeft(_ ++ _))

这是我解决这个问题的最好方法吗?

您可以这样使用
reduceLeftOption

ddls.reduceLeftOption(_ ++ _)
if (ddls.isEmpty) None else Some(ddls.reduceLeft(_ ++ _))
它的工作原理与此完全相同:

ddls.reduceLeftOption(_ ++ _)
if (ddls.isEmpty) None else Some(ddls.reduceLeft(_ ++ _))
您可以使用
foldLeft
实现几乎所有
Seq
方法。对于
reduceLeftOption

ddls.foldLeft(None: Option[DDL]){ (a, e) => a.map{ _ ++ e }.orElse( Some(e) ) }

您可以这样使用
reduceLeftOption

ddls.reduceLeftOption(_ ++ _)
if (ddls.isEmpty) None else Some(ddls.reduceLeft(_ ++ _))
它的工作原理与此完全相同:

ddls.reduceLeftOption(_ ++ _)
if (ddls.isEmpty) None else Some(ddls.reduceLeft(_ ++ _))
您可以使用
foldLeft
实现几乎所有
Seq
方法。对于
reduceLeftOption

ddls.foldLeft(None: Option[DDL]){ (a, e) => a.map{ _ ++ e }.orElse( Some(e) ) }

使用
reduceLeftOption
获得
选项
包装结果:

 ddls.reduceLeftOption(_ ++ _)

使用
reduceLeftOption
获得
选项
包装结果:

 ddls.reduceLeftOption(_ ++ _)

哦,从2.8开始就有了。羞耻脸哦,从2.8开始就有了。丢脸