在flatMap返回List <object>而不是List <string> </string> </object>之后收集Java Stream

时间:2014-06-06 09:25:38

标签: java eclipse java-8 java-stream flatmap

我使用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

,则不会出现问题

1 个答案:

答案 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());