如何在 Scala 中使用 Beam 的 PAssert.that(foo).satisfies(bar)?



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代码有同样的问题,我认为解决它的方法与KotlinScala相同:

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方法。

相关内容

最新更新