Lit*_*ild 5 java lambda scala java-8
我正在尝试transform()用DatasetJava 编写如下:
Function1<Dataset<Long>,Dataset<Long>> withDoubled = (Dataset<Long> numbers) -> numbers.withColumn("doubled",numbers.col("id").multiply(2));
spark.range(10).transform(withDoubled).show();
Run Code Online (Sandbox Code Playgroud)
但是,Function1<>被标记为错误,表示有多个抽象函数需要重写。我该如何将其写为 lambda?
lambda 与 Scala 的使用Function1并不是直接的,因为 lambda 与Interfaces 的工作只有一个abstract未实现的函数,而对于 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;
}
}
Run Code Online (Sandbox Code Playgroud)
另一个建筑商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;
}
}
Run Code Online (Sandbox Code Playgroud)
FunctionN您可以按照相同的模式为 more 添加构建器。
现在我们可以使用这些构建器来构建Function1和Function2
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));
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1807 次 |
| 最近记录: |