在flatMap返回List <Object>而不是List <String>之后收集Java Stream

Fil*_*sso 3 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());
Run Code Online (Sandbox Code Playgroud)

我得到的是List<Object>我想要的一段时间List<String>.如果我删除收集,我尝试:

Arrays.asList("A", "B").stream().flatMap(s -> Arrays.asList("X", "Y").stream().map(s1 -> s + s1));
Run Code Online (Sandbox Code Playgroud)

我正确得到了Stream<String>.

我哪里错了?有人能帮我吗?

提前谢谢了.

编辑:

问题是由于Eclipse(现在使用Kepler SR2和java 8补丁1.0.0.v20140317-1956).如果使用javac进行编译,或者如Holger所评论,使用Netbeans进行编译,则不会出现此问题

Cla*_*tin 6

类型推断是一项新功能.在完全开发工具和IDE之前,我建议使用明确键入的lambdas.如果缺少显式的强制转换,那么Eclipse甚至会崩溃,但现在已经修复了.

这是一个解决方法:

使用键入的"s1":

asList.stream()
   .flatMap(s -> Arrays.asList("X", "Y").stream().map((String s1) -> s + s1))
   .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

或者使用genric参数:

asList.stream()
   .flatMap(s -> Arrays.asList("X", "Y").stream().<String>map(s1 -> s + s1))
   .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

如果您之前添加参数flatMap而不是,则同样如此map.

但我建议你使用s::concat:

asList.stream()
   .flatMap(s -> Arrays.asList("X", "Y").stream().map(s::concat))
   .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)