从 Scala 中的列表中删除 BoxedUnit(又名“我如何从存储过程中收集值”)

Removing BoxedUnit from a List in Scala (aka "How I collect values from a stored procedure)

我有一个函数可以相当优雅地执行 SQL 存储的函数:它将参数作为 List[ProcedureParameters]。 ProcedureParameters 可以获取 In、InOut 或 Out。

当我从过程中获得 return 值时,我会这样收集它们:

val results: List[Any] = for (parameter <- ps.parameters) yield {
    index = index + 1
    parameter match {
        case Out(Types.BIGINT) => cs.getLong(index)
        case Out(Types.INTEGER) => cs.getInt(index)
        // Lots more SQL to Java specific mapping here...
    }
}

这很好地迭代了 ProcedureParameters 列表,如果有 Out(或 InOut)参数,它会获取值。

但是如果 不是 值,我会得到 BoxedUnit

results 列表,然后,像这样返回:

List(3007, (), (), (), (), (), (), 0)

我尝试的第一件事是过滤掉 BoxedUnit 实例,但我似乎找不到实现它的方法。 .filter(_ != BoxedUnit) 将无法工作,因为 BoxedUnit 不是一个值...

然后我开始研究一种方法来修改我的 for comprehension(或 yield 语句),因此它只产生 "real" 值(这意味着 None 或 Some instance)但是,仍然坚持下去。

如有任何建议,我们将不胜感激。谢谢!

.filter(_ != (()))

BoxedUnit 是在您的用例中显然泄露的实现细节。它是 Unit 类型在 JVM 上的具体化,因此它的唯一实例是我们知道的 () 类型的唯一值 Unit.