我从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中进行哪些更改?
答案 0 :(得分:2)
在通用类型(List
和Map
)中为类型变量添加类型。因此,您将不需要任何类型强制转换并将其编译。尽管代码可能在Java 8上无法运行,但是如果没有这些类型,则很难理解和维护。看起来像这样:
Map<String, List<Map<String, Object>>> results = new HashMap<>();
Object obj = results.values().stream()
.flatMap(List::stream)
.map(e -> e.get("id"));