【问题标题】:Implementing a Scala function in Java在 Java 中实现 Scala 函数
【发布时间】:2014-10-26 17:48:01
【问题描述】:

我正在尝试实现一个 scala 函数对象(特别是 - 与 apache spark 一起使用)

等效的 java 类型是scala.Function0(用于无参数函数)

除了实现业务逻辑apply()的方法外,我看到我还要实现其他几个方法。

简单的谷歌搜索方法名称没有帮助(我看到了关于应该实现的 tag 方法的参考 - 但这里的方法名称不同。

这是包含这些方法的代码(具有空实现)。

    private static class functionObject implements Function0<Integer>{

    @Override
    public Integer apply() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public byte apply$mcB$sp() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public char apply$mcC$sp() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public double apply$mcD$sp() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public float apply$mcF$sp() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public int apply$mcI$sp() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public long apply$mcJ$sp() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public short apply$mcS$sp() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void apply$mcV$sp() {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean apply$mcZ$sp() {
        // TODO Auto-generated method stub
        return false;
    }

}

这些方法是什么?他们应该如何实施?有没有更清洁的解决方案可以将这些添加到任何类中?

【问题讨论】:

  • 也许是一个愚蠢的问题,但你为什么要尝试在 java 中编写一个 scala 函数?用scala写还是写java构造?
  • 我正在尝试在 java 项目中使用 apache spark。 spark 是一个 scala 项目,因此它需要 scala 对象。我们的项目是java,所以我不想添加scala代码。从理论上讲,java - scala(特别是 java - spark)的互操作性应该是相对简单的——但显然有些问题不是很简单(或者至少缺乏文档)
  • @Ophiiryoktan Scala -> Java,简单。 Java -> 斯卡拉;变化。如果 scala 库是为它设计的(!?!),那么容易,否则就是一团糟
  • 实现AbstractFunctionX
  • 使用 Scala,使用编写工具完成工作,而不是坚持你觉得安全的东西。当你学习 scala 时,你会开始讨厌 java 的冗长,并意识到你可以解雇 10 个 java 开发人员并用 1 个 scala 开发人员替换

标签: java scala scala-java-interop


【解决方案1】:

Scalas FunctionX 接口是特征,其类型参数是专门的。因为特化是由 scalac 完成的,因此不能由 javac 完成,您必须自己实现与特化相关的所有内容。

Scala提供了抽象类AbstractFunctionX,可以在Java端轻松实现:

// example Int => Int function
class Z extends scala.runtime.AbstractFunction1<Integer, Integer> {
  public Integer apply(Integer i) {
    return i;
  }
}

【讨论】:

  • 很好的答案!自 scala 2.7 以来,我确实实现了类似的类(尽管不是专门的),但没有注意到它们的存在。你知道他们是什么时候介绍的吗?
  • @paradigmatic 自 2009 年 12 月起:github.com/scala/scala/commit/…
猜你喜欢
  • 1970-01-01
  • 2014-02-23
  • 2019-03-21
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
  • 2015-01-29
相关资源
最近更新 更多