gpt4 book ai didi

java - Scala Function1 在 Java 中变为 Function1

转载 作者:行者123 更新时间:2023-12-02 15:48:40 24 4
gpt4 key购买 nike

我正在尝试使用 Java 中的 Deequ 库,但在使用以下方法时遇到问题:

  def hasCompleteness(
column: String,
assertion: Double => Boolean,
hint: Option[String] = None)
: CheckWithLastConstraintFilterable = {
addFilterableConstraint { filter => completenessConstraint(column, assertion, filter, hint) }
}

特别是,对于断言,我需要传入一个 Function1<Double, Boolean>

所以我使用下面的代码在 Java 中创建一个断言函数:

public static Function1<Double, Boolean> atLeast(double thresholdPercentage) {
return new scala.compat.java8.functionConverterImpls.FromJavaFunction<>((Double actualPercentage) -> actualPercentage >= thresholdPercentage);
}

很简单吧?

只是,我的 Java 类现在无法编译,因为 hasCompleteness 的签名方法,当 从 Java 查看时,断言参数是 Function1<Object, Object> .因此我看到以下错误:

Required type: Function1<Object, Object>
Provided: Function1<Double, Boolean>

如果我改变我的 atLeast返回未参数化的方法 Function1问题消失了,但这感觉像是一个丑陋的拼凑。

从 Java 使用此方法时,我是否注定要丢失类型参数?还是我的 IntelliJ/Gradle 设置有问题导致了这种奇怪的行为?

最佳答案

peterz 详细说明了幕后发生的事情。

听起来您需要的是从原始 double Java 谓词 (java.util.function.DoublePredicate) 到 scala.Double< 的显式转换 Scala 谓词(Double => Boolean)。

Scala 实际上提供了一种名为 FromJavaDoublePredicate 的转换。代码不再需要显式 Double 转换:

  /* some scala file */
def hasCompleteness(
x: Double,
f: Double => Boolean
): Unit = println(f(x))

/* some java file */
public static FromJavaDoublePredicate atLeast(double thresholdPercentage) {
return new scala.compat.java8.functionConverterImpls.FromJavaDoublePredicate(
actualPercentage -> actualPercentage >= thresholdPercentage);
}

FromJavaDoublePredicate f = atLeast(3.0);
Test.hasCompleteness(5, f); // true

附言。据我所见,你选择了scala-java8-compat ,所以我假设您使用的是早期版本的 Scala。他们的维护者声明:

If you are using Scala 2.13 or newer only, then don't use thislibrary! Use the classes under scala.jdk instead; they were added tothe standard library in 2.13.

所以对于 Scala 2.13.x,我建议使用 FromJavaDoublePredicate FunctionWrappers 对象中的案例类。

关于java - Scala Function1<T,U> 在 Java 中变为 Function1<Object,Object>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73298883/

24 4 0