从 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
.
我有一个函数可以相当优雅地执行 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
.