【问题标题】:Java 8 functional: Lost type information in the middle of the wayJava 8 函数式:中途丢失类型信息
【发布时间】:2015-04-22 09:48:04
【问题描述】:

考虑这个转换示例(请参阅关于应该发生什么的详细描述here):

Map<String, Integer> transform(Map<Integer, List<String>> old) {
    old.entrySet().stream()
       .flatMap(entry -> entry.getValue().stream()
                   .map(letter -> letter.toLowerCase())
                   .map(lowerCaseLetter -> new SimpleEntry<String, Integer>(lowerCaseLetter, entry.getKey())))
       // at this point, the type is Stream<Object>, not Stream<SimpleEntry<String,Integer>>
       .collect(Collectors.toMap());

  }

为什么关于特定类型的信息会在这里丢失,我该如何解决这个问题?

【问题讨论】:

  • 对我来说工作得很好。尝试使用 javac。你在用 Eclipse 吗?
  • 是的,我是... javac 也为我工作。猜猜这是eclipse中的一个错误..
  • 是的,Eclipse 在其自己的编译器(尤其是在类型推断方面)和 java 8 特性方面仍然存在问题。你可以向 Eclipse 开发团队提交一个 bug,或者切换到 IntelliJ(它使用 javac,这是我在 Java 8 之后切换到它的主要原因之一......)
  • 如果您将其添加为答案,我会接受。如果这是一个已知错误,也许您可​​以提供该问题的链接?

标签: java lambda functional-programming


【解决方案1】:

Eclipse 在其自己的编译器(尤其是在类型推断方面)和 Java 8 特性方面仍然存在问题。在这种情况下,当您遇到此类问题时,请先尝试使用 javac 进行编译。如果它确实编译了,那么它肯定是一个 Eclipse 问题。

如果你需要坚持使用 Eclipse,你可以通过提供类型参数来帮助 ECJ(Eclipse 的编译器),但通常你不应该这样做(在早期版本中可能是这样,但 java 编译器在类型推断)。

您可以向 Eclipse 开发团队提交一个错误(在您拥有最新版本之前检查一下),但是 java 8 的错误跟踪器非常密集。

另一种选择是切换到使用 javac 的 IntelliJ,这是我在 Java 8 之后切换到它的主要原因之一...

看看你的代码,你可以让它稍微短一点:

Map<String, Integer> transform(Map<Integer, List<String>> old) {
    return old.entrySet().stream()
              .flatMap(e -> e.getValue().stream().map(s -> new SimpleEntry<>(s.toLowerCase(), e.getKey())))
              .collect(toMap(SimpleEntry::getKey, SimpleEntry::getValue));
}

【讨论】:

    【解决方案2】:

    你说的不对。类型信息被保留。 至少在:

    java 版本 "1.8.0_40" Java(TM) SE Runtime Environment (build 1.8.0_40-b25) Java HotSpot(TM) 64 位服务器 VM(内部版本 25.40-b25,混合模式)

    【讨论】:

    • 你是对的,eclipse是这里的问题。但我不明白你建议的改进。 flatMap(Map) 怎么会起作用?
    • @S1lentSt0rm,我进一步分析并意识到我失败得很惨。在这种情况下,我的建议无效。我将编辑我的答案
    猜你喜欢
    • 1970-01-01
    • 2016-12-04
    • 2015-06-20
    • 2017-06-21
    • 1970-01-01
    • 2019-05-26
    • 2020-12-19
    • 2019-10-25
    • 2011-10-16
    相关资源
    最近更新 更多