Java 为什么我可以通过命令行编译此代码,而不能使用Eclipse?

Java 为什么我可以通过命令行编译此代码,而不能使用Eclipse?,java,eclipse,java-8,Java,Eclipse,Java 8,这些代码行 System.out.println( Stream.of("adam", "bob", "adrian", "brian") .collect( Collectors.groupingBy( x -> x.substring(0,1), //1 Collectors.joining("-")))

这些代码行

    System.out.println(
        Stream.of("adam", "bob", "adrian", "brian")
        .collect(
                Collectors.groupingBy(
                        x -> x.substring(0,1),        //1
                        Collectors.joining("-")))
    );
当通过命令行使用
javac
时,可以很好地编译,但当我尝试在Eclipse中编译时,会出现此错误

类型CharSequence的方法子字符串(int,int)未定义

Eclipse如何干扰编译器?IDE不是只使用
javac.exe


我使用的是EclipseLuna 4.4.1和Oracle jdk1.8.0_45。首先,您应该确保这不是语法错误。 将代码更改为如下所示:

x -> ((String) x).substring(0,1)
除了确保使用与Java 8完全兼容的Eclipse版本外,还应该检查是否允许Eclipse使用Java 8语言特性


如果您没有指定JRE的正确版本,您可以按此处所述进行更改:

从4.5里程碑3开始,问题已经在Eclipse中得到解决,很可能是通过。这一变化结合了一些bug修复和Java8发布后的改进


在规范更改之前,我们可以讨论该示例是否真的是合法的Java 8(之前的推断不允许使用嵌套lambda实体中的一些信息),但我希望只更新到Eclipse 4.5.1会让每个人都感到高兴。

在Eclipse Mars 4.5.1中适用于我。只需升级。您的Eclipse项目是否可能使用不同版本的Java进行编译?您的问题的一般解决方案的可能重复是:理解等式中的变量。在这种情况下:什么版本的Java在命令行中起作用(一些了解Java8的东西)。。。您的eclipse支持哪一版本的Java(可能不是Java 8;所以我猜您运行的是Luna(?)或更老的版本?!我可以确认这没有在Luna(4.4)上编译使用Java 8,但可以在火星上运行。已经检查过了,JRE是正确的。在这一点上,这不应该被认为是一个bug吗?只要您确定这在Eclipse的干净安装上不起作用,并且您的代码不包含任何错误。我必须将您的代码更改为
x->((String)x).substring(0,1)
为了让它在我的STS 3.7.1上运行,就是这样!您不需要任何更改就可以使用Oracle javac.exe成功编译它。也许您可以创建一个新的答案,并询问是否有可能在没有这种相当难看的强制转换的情况下实现相同的结果。为了避免强制转换,您还可以像这样声明
x
的类型:
(字符串x)->x.substring(0,1)
。这将有助于编译器,同时还保留了类型安全性。不过,这看起来像eclipse<4.5编译器中的一个bug。