java - 为什么 mapToInt 不能与 collect(toList()) 一起使用?
问题描述
我写了这段代码:
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String... args) {
List<String> a = Arrays.asList("One", "Two", "three");
List<Integer> lengths = a.stream().mapToInt(String::length).collect(Collectors.toList());
}
}
但它不想编译,说:
Error:(8, 68) java: method collect in interface java.util.stream.IntStream cannot be applied to given types;
required: java.util.function.Supplier<R>,java.util.function.ObjIntConsumer<R>,java.util.function.BiConsumer<R,R>
found: java.util.stream.Collector<java.lang.Object,capture#1 of ?,java.util.List<java.lang.Object>>
reason: cannot infer type-variable(s) R
(actual and formal argument lists differ in length)
这里发生了什么事?为什么会有限制?如果你使用地图。而不是 mapToInt,它可以正常工作。
解决方案
mapToInt
产生一个IntStream
,它没有collect
采用单个Collector
参数的方法。
由于最终结果是 a List<Integer>
,因此您不必将 the 转换Stream
为 a IntStream
:
List<Integer> lengths = a.stream().map(String::length).collect(Collectors.toList());
如果要将 的元素收集到原始数组,则将转换Stream
为 aIntStream
是有意义的:Stream
int[] lengths = a.stream().mapToInt(String::length).toArray();
如果你想转换为anIntStream
并且仍然使用该collect
方法,你可以写如下(不太推荐):
List<Integer> lengths =
a.stream()
.mapToInt(String::length)
.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
推荐阅读
- python - 如何打印矩阵以便有不同的行和列?
- python - 练习邻接表和 BFS 的编码练习
- javascript - 是否可以在文档中获取集合以及所有其他文档数据?
- kubernetes - 为什么 pulumi kubernetes 提供商要更改服务和部署名称?
- discord.js - (Discord.js) 尝试根据频道名称获取频道ID,并在其中发布消息
- react-native - 如何在 React Native 中显示来自 Firebase Firestore 的数据
- javascript - 有没有办法在几个数组中搜索低于某个值的东西?
- python - Python中的随机函数预测
- javascript - 反应获取 div clientWidth 在组件 didUpdate 中返回 null
- ios - 视频无法在 iOS Safari 上播放