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

标签 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(现在使用带有 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/

相关文章:

android - android SDK中的target SDK选项必须与测试设备Android版本相同吗? (Android SDK基础)

android - 我如何让我的谷歌地图应用程序开始缩放我当前的位置

eclipse - 在“打开资源”对话框中键入时,是否可以通过目录而不是文件名来查找文件?

java - 使用 Java 8 Streams API,在调用 Collectors.toSet() 时是否可以依赖 sorted()?

java - 按条目的递减乘积生成列表的笛卡尔乘积(条目是正数,列表已排序)

java - RxJava2 由于分支逻辑而丢失结果

java - 使用 Spring Boot 将 Oracle 数据传输到 SQL Server

java - 使用 Java 8 的 SonarQube 和 squidS2095

java - 如何验证战舰字段?

java javax.net.ssl.SSLHandshakeException : No subject alternative names present