Beam Java API有一个PAssert
方法satisfies
,它接受一个类型为SerializableFunction<Iterable<T>, Void>
的函数
然而,Java的Void
与Scala的Unit
并不完全相同,所以如果您传递类似的东西,编译器会报错PAssert.that(foo).satisfies(contents => contents.forEach(_.someListProperty.nonEmpty))
.
您可以在forEach
的末尾添加asInstanceOf[Null]
来消除编译错误,但是它会抛出一个运行时异常,表示它不能将类强制转换为null。
如果在函数结束时也显式返回null,则测试的结果始终为true,即使谓词为false。
如何使用这个函数?或者是否有另一种方法来测试结果PCollection的每个单独元素是否满足条件?
你的问题中的这句话是核心问题:
如果在函数结束时也显式返回null,则测试的计算结果始终为true,即使谓词为false。
函数的思想是,如果出现问题,它应该抛出异常,例如通过使用断言方法。因此,在末尾添加显式return null
的方法是直接在Scala中使用它的正确方法。在另一个答案中添加一个漂亮的包装器也很好。
我对Kotlin
代码有同样的问题,我认为解决它的方法与Kotlin
和Scala
相同:
PAssert.that(result).satisfies(assertResult)
// OR
PAssert.that(result).satisfies(assertResult(_))
// OR
PAssert.that(result).satisfies(r => assertResult(r))
private def assertResult(result: Iterable<YouClass>): Void = {
// Apply your assertions.
null
}
我创建了一个方法,获取结果Iterable
并返回Void
,然后在函数中返回null
。
在测试和PAssert.that(foo).satisfies
方法中,我可以在lambda函数中调用assertResult
方法。