我使用 Java 8 流尝试了以下代码:
Arrays.asList("A", "B").stream()
.flatMap(s -> Arrays.asList("X", "Y").stream().map(s1 -> s + s1)).collect(Collectors.toList());
我得到的是 List<Object>
虽然我期待一个 List<String>
.如果我删除收集并尝试:
Arrays.asList("A", "B").stream().flatMap(s -> Arrays.asList("X", "Y").stream().map(s1 -> s + s1));
我正确地得到了 Stream<String>
.
我哪里错了?有人能帮我吗?
非常感谢。
编辑:
问题是由于 Eclipse(现在使用带有 java 8 补丁 1.0.0.v20140317-1956 的 Kepler SR2)引起的。如果使用 javac 进行编译,或者如 Holger 所评论的那样,使用 Netbeans,则不会出现此问题
最佳答案
类型推断是一项新功能。在工具和 IDE 完全开发之前,我建议使用显式类型化的 lambda。在某些情况下,如果缺少显式转换,Eclipse 甚至会崩溃,但现在已修复。
解决方法如下:
输入“s1”:
asList.stream()
.flatMap(s -> Arrays.asList("X", "Y").stream().map((String s1) -> s + s1))
.collect(Collectors.toList());
或者使用通用参数:
asList.stream()
.flatMap(s -> Arrays.asList("X", "Y").stream().<String>map(s1 -> s + s1))
.collect(Collectors.toList());
如果在flatMap
而不是map
之前添加参数也是如此。
但我建议你使用s::concat
:
asList.stream()
.flatMap(s -> Arrays.asList("X", "Y").stream().map(s::concat))
.collect(Collectors.toList());
关于flatMap 返回 List<Object> 而不是 List<String> 后,Java Stream 收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24078414/