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

标签 java scala lambda java-8

我正在尝试 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/

相关文章:

包含 lambda 函数的 python 映射类对象

java - 编译错误 : Lambda Target Type Intersection Type

C++ GLFW3 输入处理

java - 当值位于 ArrayList 中时,如何继续向已存在的键添加值?输入来自扫描仪以创建 TreeMap

java - java命令清除屏幕

java - 过滤掉 JPA 查询中的嵌套对象

java - 如何在 Play 2.2 中设置 Play Framework 404 (On HandlerNotFound) 页面?

arrays - 如何判断一个数组是否有连续的整数,如果有,有多少个?

java - Clojure实现带超时的 future vector

scala - toArray 的值不是 org.apache.spark.rdd.RDD[(String, Int)] 的成员