将Java代码从Java8语法转换为Java7语法的工具?

将Java代码从Java8语法转换为Java7语法的工具?,java,lambda,java-7,java-8,inner-classes,Java,Lambda,Java 7,Java 8,Inner Classes,有人知道有什么工具可以将使用lambda和方法引用的Java8代码(在源代码级别)转换为使用匿名内部类的Java7代码吗? 我知道,但这是在字节码级别工作的,而不是在源代码级别 现在,我有一个版本可以作为IntelliJ插件使用。 我扩展了当前的IntelliJ代码,以一次性转换包中的所有lambda,而不是。 但是,这种方法的问题是它不能作为一个独立的工具工作,比如说maven插件,因为它需要IntelliJ上下文才能工作 编辑:注意,重点是将lamda/方法引用转换为匿名内部类。我并不担心J

有人知道有什么工具可以将使用lambda和方法引用的Java8代码(在源代码级别)转换为使用匿名内部类的Java7代码吗? 我知道,但这是在字节码级别工作的,而不是在源代码级别

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


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

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

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

它可以将函数接口的变量声明转换为 将lambda初始值设定项转换为匿名内部类

e、 g:

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

// Converted to:

Callable<String> callable = new Callable<String>() {
    public String call() throws java.lang.Exception { 
        return "abc"; 
    }
};
Callable Callable=()->“abc”;
//转换为:
Callable Callable=new Callable(){
公共字符串调用()抛出java.lang.Exception{
返回“abc”;
}
};
我不知道它是否可以转换匿名lambda(即未声明为变量的lambda)或方法引用(例如
Person::compareByAge
)或闭包(局部变量捕获),但如果需要,这些可能是您可以扩展其代码的功能


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

小心点。Java8引入了许多Java7中不可用的新API。将lambda更改为匿名内部类可能不是唯一需要迁移的事情。@unholysampler是的,我知道这一点。在我的用例中,我们不必担心Java8中新的API变化。最坏的情况是,如果发生这种情况,Java 7编译器将抛出编译错误,供用户修复代码,您需要一个后端口流api和后端口java.util.function以及一种处理默认方法的方法。@StuartMarks我们需要另一个“customizer”工具将默认方法移动到实现类:)这个问题需要一个工具,而不是手动检查整个代码库。