使用JDK 11的stream / flatMap中的编译器错误

时间:2019-09-07 11:01:08

标签: java

我从JDK 1.8.0_212升级到JDK 11.0.4,以下代码不再起作用。

Map<String, Object> results = new HashMap<>();

Object obj = results.values().stream()
        .map(o -> (List) o)
        .flatMap(List::stream)
        .map(o -> (Map) o)
        .map(e -> e.get("id"));

在Java 11中,它在代码的最后一行给出此错误:

Error:(13, 24) java: cannot find symbol
  symbol:   method get(java.lang.String)
  location: variable e of type java.lang.Object

这似乎是由flatMap引起的,因为此重新排列的代码可以正常工作:

Object obj = results.values().stream()
        .map(o -> (Map) o)
        .map(e -> e.get("id"))
        .map(o -> (List) o)
        .flatMap(List::stream);

有什么想法为什么可以在Java 8中使用,但不能在Java 11中使用?我需要在Java 11中进行哪些更改?

1 个答案:

答案 0 :(得分:2)

在通用类型(ListMap)中为类型变量添加类型。因此,您将不需要任何类型强制转换并将其编译。尽管代码可能在Java 8上无法运行,但是如果没有这些类型,则很难理解和维护。看起来像这样:

Map<String, List<Map<String, Object>>> results = new HashMap<>();

Object obj = results.values().stream()
      .flatMap(List::stream)
      .map(e -> e.get("id"));