Collectors.toMap无法编译

时间:2014-11-11 09:12:33

标签: java java-stream

此代码无法编译

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

2 个答案:

答案 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的两个版本之间也遇到了类似的问题。