【问题标题】:Tool to Delambdafy Java code from Java 8 to Java 7 syntax? [closed]将 Java 代码从 Java 8 转换为 Java 7 语法的工具? [关闭]
【发布时间】:2014-07-24 20:51:17
【问题描述】:

是否有人知道任何工具可以将使用 lambda 和方法引用的 Java 8 代码(在源代码级别)转换为使用匿名内部类的 Java 7 代码? 我知道Retrolambda,但这适用于字节码级别,而不是源级别。

目前,我有一个可用作 IntelliJ 插件的版本。 我扩展了当前的 IntelliJ 代码以一次性转换包中的所有 lambda,而不是 selecting each lambda individually and converting to anonymous inner class。 但是,这种方法的问题在于它不能作为独立工具工作,比如 maven 插件,因为它需要 IntelliJ 上下文才能工作。

编辑:请注意,重点是将 lamda/方法引用转换为匿名内部类。我不担心 Java 8 中的 API 更改会被 Java 7 编译器捕获并报告为编译错误。

【问题讨论】:

  • 小心。 Java 8 引入了许多在 Java 7 中不可用的新 API。将 lambdas 更改为匿名内部类可能不是唯一需要迁移的东西。
  • @unholysampler 是的,我知道这一点。在我的用例中,我们不必担心 Java 8 中的新 API 更改。最坏的情况是,Java 7 编译器会抛出编译错误,以便用户修复代码。
  • 是的,你需要一个反向移植的流 api 和反向移植的 java.util.function
  • 还有一种处理默认方法的方法。
  • @StuartMarks 我们需要另一个“定制器”工具来将默认方法移动到实现类:)

标签: java lambda java-7 java-8 inner-classes


【解决方案1】:

在 IntelliJ Idea 中打开“项目结构”,然后将项目语言级别设置为 7.0。如果需要,请再次分析您的代码。这在大多数情况下会有所帮助,但更喜欢逐类(逐个文件)进行。

【讨论】:

  • 问题要求提供工具,而不是手动审查整个代码库。
【解决方案2】:

你可以试试this。做一些接近你要求的事情是一个人的概念验证:

它可以将函数接口的变量声明转换为 将 lambda 初始化器转换为匿名内部类。

例如:

Callable<String> callable = () -> "abc" ;

// Converted to:

Callable<String> callable = new Callable<String>() {
    public String call() throws java.lang.Exception { 
        return "abc"; 
    }
};

我不知道它是否可以转换匿名 lambda(即未声明为变量的那些)或方法引用(例如 Person::compareByAge)或闭包(局部变量捕获),但这些可能是您可以扩展他的功能如果您需要它们,请执行代码。

作者指出“功能完善还有很长的路要走,但它是可用的……”

【讨论】:

    猜你喜欢
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    相关资源
    最近更新 更多