首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Collectors.toMap不编译

Collectors.toMap不编译
EN

Stack Overflow用户
提问于 2014-11-11 09:12:33
回答 2查看 3.8K关注 0票数 8

这段代码不编译

代码语言:javascript
复制
List<String> pairs = new ArrayList<>();
System.out.println(pairs.stream().collect(Collectors.toMap(x -> x.split("=")[0], x -> x.split("=")[1])));

编译错误是:对System.out.println(pairs.stream().collect(Collectors.toMap(x -> x.split("=")、x -> x.split(“=”1)的类型对象错误未定义方法split(String) );

但是这个编译得很好

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-21 03:08:24

IntelliJ的版本有所不同(只是IDE源代码编辑器中的红线)。代码应该由JDK成功编译。

IntelliJ 13可以用于您的代码。IntelliJ 12对lambda表达式的支持很差。在使用lambda表达式时,我还在两个版本的IntelliJ之间遇到了类似的问题。

票数 1
EN

Stack Overflow用户

发布于 2014-11-11 09:29:25

我假设您使用的是IDE (如Eclipse)。例如,Eclipse使用自己的编译器,而不使用"javac“命令(来自JDK)。

因此,我可以重现您的问题,但只限于Eclipse。简单地用"javac“在命令行上编译这段代码就可以了。

问题非常简单:Eclipse编译器无法为collect方法的参数推断collect类型。因此,它只是推断Object (因为这是类型,编译器可以安全地假设)。Object不知道split方法。

您可以通过在lambda中明确声明类型来强制编译器了解String

代码语言:javascript
复制
List<String> pairs = new ArrayList<>();
System.out.println(pairs.stream().collect(Collectors.toMap((String x) -> x.split("=")[0], x -> x.split("=")[1])));

..。或者通过明确声明geneirc toMap方法的正确类型:

代码语言:javascript
复制
List<String> pairs = new ArrayList<>();
System.out.println(pairs.stream().collect(Collectors.<String, String, String> toMap(x -> x.split("=")[0], x -> x.split("=")[1])));
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26861239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档