这段代码不编译
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) );
但是这个编译得很好
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
发布于 2014-11-21 03:08:24
IntelliJ的版本有所不同(只是IDE源代码编辑器中的红线)。代码应该由JDK成功编译。
IntelliJ 13可以用于您的代码。IntelliJ 12对lambda表达式的支持很差。在使用lambda表达式时,我还在两个版本的IntelliJ之间遇到了类似的问题。
发布于 2014-11-11 09:29:25
我假设您使用的是IDE (如Eclipse)。例如,Eclipse使用自己的编译器,而不使用"javac“命令(来自JDK)。
因此,我可以重现您的问题,但只限于Eclipse。简单地用"javac“在命令行上编译这段代码就可以了。
问题非常简单:Eclipse编译器无法为collect方法的参数推断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])));https://stackoverflow.com/questions/26861239
复制相似问题