此代码无法编译
List<String> pairs = new ArrayList<>();
System.out.println(pairs.stream().collect(Collectors.toMap(x -> x.split("=")[0], x -> x.split("=")[1])));
编译错误是:对于Object类型,方法split(String)未定义 System.out.println出错(pairs.stream()。collect(Collectors.toMap(x - &gt; x.split(“=”)[0],x - &gt; x.split(“=”)[1 ])));
但是这个编译很好
List<String> pairs = new ArrayList<>();
Map<String,String> map = pairs.stream().collect(Collectors.toMap(x -> x.split("=")[0], x -> x.split("=")[1]));
System.out.println(map);
有人可以解释原因吗?
更多信息
是intellij 12; jdk1.8.0_11; Windows 64
答案 0 :(得分:4)
我假设您使用的是IDE(如Eclipse)。 Eclipse(例如) - 使用自己的编译器,不使用“javac”命令(来自JDK)。
所以,我可以重现你的问题,但只能用Eclipse。只需在命令行上使用“javac”编译此代码就可以了。
问题非常简单:Eclipse编译器无法推断String
方法参数的类型collect
。所以它只是推断Object
(因为这是类型,编译器可以安全地假设)。而Object
不知道split
方法。
您可以通过明确声明lambda中的类型来强制编译器了解String
:
List<String> pairs = new ArrayList<>();
System.out.println(pairs.stream().collect(Collectors.toMap((String x) -> x.split("=")[0], x -> x.split("=")[1])));
...或通过明确声明geneirc toMap
方法的正确类型:
List<String> pairs = new ArrayList<>();
System.out.println(pairs.stream().collect(Collectors.<String, String, String> toMap(x -> x.split("=")[0], x -> x.split("=")[1])));
答案 1 :(得分:1)
IntelliJ的版本不同(在IDE的源代码编辑器中只是红线)。代码应该由JDK成功编译。
IntelliJ 13适用于您的代码。 IntelliJ 12支持lambda表达式很差。当使用lambda表达式时,我在IntelliJ的两个版本之间也遇到了类似的问题。