我使用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(现在使用Kepler SR2和java 8补丁1.0.0.v20140317-1956)。如果使用javac进行编译,或者如Holger所评论,使用Netbeans
,则不会出现问题答案 0 :(得分:6)
类型推断是一项新功能。在完全开发工具和IDE之前,我建议使用明确键入的lambdas。如果缺少显式的强制转换,那么Eclipse甚至会崩溃,但现在已经修复了。
这是一种解决方法:
输入“s1”:
asList.stream()
.flatMap(s -> Arrays.asList("X", "Y").stream().map((String s1) -> s + s1))
.collect(Collectors.toList());
或者使用genric参数:
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());