为什么我们必须将Collectors.toList()返回的List转换为List ,即使Stream的元素已经映射到Integer?

我将原始Stream映射到Stream ,然后将元素收集到List

如果我的mapper – .map(str -> ((String)str).length()) – 我已经映射到Integer为什么我必须将collect(Collectors.toList())List

我的代码:

 List list = Arrays.asList("test", "test2"); List lengths = (List) list.stream() .map(str -> ((String)str).length()) .collect(Collectors.toList()); 

如果我不使用原始List ,则无需强制转换:

 List list = Arrays.asList("test", "test2"); List lengths = list.stream() .map(str -> str.length()) .collect(Collectors.toList()); 

在原始List上调用list.stream()会生成原始Stream 。 在该Stream上调用map不会将该Stream更改为通用Stream 。 它将其更改为另一个原始Stream 。 因此,当您调用collect(Collectors.toList()) ,您将获得一个原始List并且必须将其强制转换为(List)

结论:不要使用原始类型。