gpt4 book ai didi

java - 将 scala.Function1 写成 lambda 的正确方法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:52:26 29 4
gpt4 key购买 nike

我正在尝试 transform()一个Dataset在 Java 中如下所示:

Function1<Dataset<Long>,Dataset<Long>> withDoubled = (Dataset<Long> numbers) -> numbers.withColumn("doubled",numbers.col("id").multiply(2));
spark.range(10).transform(withDoubled).show();

然而,Function1<>被标记为错误,表示有多个抽象函数要覆盖。我如何将其写成 lambda?

最佳答案

将 lambda 与 Scala 的 Function1 结合使用并不是直截了当的,因为 lambda 与 Interface 的结合只有一个抽象 未实现的函数这在 Scala 的 Function1 特征的情况下是不正确的。

我们可以使用变通方法,

首先让我们定义构建器,使工作可重用,

Function1 的生成器,

package lambdascala;

import scala.Function1;

public class Function1WithLambdaBuilder<P1, R> {

public static interface Function1LambdaApply<P1, R> {
R apply(P1 p1);
}

private Function1LambdaApply<P1, R> lambda;

private Function1<P1, R> function;

public Function1WithLambdaBuilder(Function1LambdaApply<P1, R> lambda) {
this.lambda = lambda;
this.function = new Function1<P1, R> () {
@Override
public R apply(P1 p1) {
return Function1WithLambdaBuilder.this.lambda.apply(p1);
}
};
}

public Function1<P1, R> getFunction() {
return this.function;
}

}

Function2 的另一个构建器

package lambdascala;

import scala.Function2;

public class Function2WithLambdaBuilder<P1, P2, R> {

public static interface Function2LambdaApply<P1, P2, R> {
R apply(P1 p1, P2 p2);
}

private Function2LambdaApply<P1, P2, R> lambda;

private Function2<P1, P2, R> function;

public Function2WithLambdaBuilder(Function2LambdaApply<P1, P2, R> lambda) {
this.lambda = lambda;
this.function = new Function2<P1,P2, R> () {
@Override
public R apply(P1 p1, P2 p2) {
return Function2WithLambdaBuilder.this.lambda.apply(p1, p2);
}
};
}

public Function2<P1, P2, R> getFunction() {
return this.function;
}

}

您可以按照相同的模式为更多 FunctionN 添加构建器。

现在我们可以使用这些构建器构建Function1Function2

import lambdascala.Function1WithLambdaBuilder;
import lambdascala.Function2WithLambdaBuilder;
import scala.Function1;
import scala.Function2;
import java.util.List;

public class LambdaTry {

public static void main() {

Function1<List<Long>, List<Long>> changeNothing =
new Function1WithLambdaBuilder<List<Long>, List<Long>>(
// your lambda
(List<Long> list) -> list
).getFunction();

Function1<Integer, Integer> add2 =
new Function1WithLambdaBuilder<Integer, Integer>(
// your lambda
(Integer i) -> i + 2
).getFunction();

Function2<Integer, Integer, Integer> add =
new Function2WithLambdaBuilder<Integer, Integer, Integer>(
// your lambda
(Integer i, Integer j) -> i + j
).getFunction();

System.out.println(add2.apply(12));

System.out.println(add.apply(12, 24));

}

}

关于java - 将 scala.Function1 写成 lambda 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39773306/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com