【问题标题】:Java Stream collect after flatMap returns List<Object> instead of List<String>flatMap 返回 List<Object> 而不是 List<String> 后的 Java Stream collect
【发布时间】:2014-07-27 12:31:59
【问题描述】:

我使用 Java 8 流尝试了以下代码:

Arrays.asList("A", "B").stream()
            .flatMap(s -> Arrays.asList("X", "Y").stream().map(s1 -> s + s1)).collect(Collectors.toList());

我得到的是List&lt;Object&gt;,而我期待的是List&lt;String&gt;。如果我删除收集并尝试:

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

我正确地得到了Stream&lt;String&gt;

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

非常感谢。

编辑:

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

【问题讨论】:

  • 不适合我。它返回Stream&lt;String&gt;。你用的是哪个编译器?
  • @Holger,我在 Eclipse 中编译
  • 好吧,Eclipse 的 Java 8 支持仍在开发中,但我建议您仔细检查您在 Eclipse 中编写的代码是否与您在此处编写的代码相匹配,然后再指责 Eclipse,因为它看起来不对我来说就像一个棘手的语言结构(编译器极端案例)。使用Kepler SR2JDT Patch with Java 8 1.0.0.v20140317-1956 可以正常工作。
  • @Holger,你对流的看法是对的,我已经更新了我的问题,显然问题不在流中,而是在我最初删除以(过度)简化我的问题的集合中跨度>
  • 好的,现在它看起来像一个 Eclipse 问题。使用Netbeans,您可以正确收集到List&lt;String&gt;

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


【解决方案1】:

类型推断是一项新功能。在工具和 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());

【讨论】:

    猜你喜欢
    • 2022-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 2023-04-08
    相关资源
    最近更新 更多