如何将Java 8 IntStream收集至Deque接口?
如何将Java 8 IntStream收集到Deque接口中?
嘿,这个问题问得很到位!你已经熟练掌握了把IntStream收集到List的方法,其实要转成Deque只需要微调一下收集器的用法就行,核心就是明确指定Deque的具体实现类来完成收集。
方法一:用Collectors.toCollection()指定Deque实现
因为Deque是接口,没法直接实例化,所以我们需要通过Collectors.toCollection()传入一个Supplier,来创建具体的Deque实现类(比如LinkedList或ArrayDeque,这俩都是Java里常用的Deque实现)。
示例代码如下:
// 用LinkedList作为Deque的底层实现 Deque<Integer> integerDeque = IntStream.of(1, 2, 3) .boxed() // 先把基本类型int装箱为Integer对象 .collect(Collectors.toCollection(LinkedList::new));
如果你偏好数组结构的Deque(随机访问性能更优),换成ArrayDeque就行:
// 用ArrayDeque作为Deque的底层实现 Deque<Integer> integerDeque = IntStream.of(1, 2, 3) .boxed() .collect(Collectors.toCollection(ArrayDeque::new));
为啥必须用boxed()?
这里的boxed()是绕不开的——Deque作为集合框架的一员,只能存储对象类型(Integer),而IntStream里的元素是基本类型int,所以必须先完成装箱,把int转成Integer才能存入Deque。
自定义收集逻辑(可选)
如果需要特殊的收集行为(比如反向插入元素),可以在toCollection()里自定义Supplier逻辑:
Deque<Integer> reversedDeque = IntStream.of(1, 2, 3) .boxed() .collect(Collectors.toCollection(() -> { Deque<Integer> deque = new LinkedList<>(); // 这里可以加自定义逻辑,比如遍历元素反向添加 return deque; }));
不过更简单的反向收集方式是先对Stream排序再收集:
Deque<Integer> reversedDeque = IntStream.of(1, 2, 3) .boxed() .sorted(Comparator.reverseOrder()) .collect(Collectors.toCollection(LinkedList::new));
总结
其实收集到Deque和收集到List的逻辑是相通的——都是通过Collectors指定目标集合的创建方式。区别只是List有默认的Collectors.toList()(底层默认用ArrayList),而Deque需要我们明确指定具体的实现类。
内容的提问来源于stack exchange,提问作者maheryhaja
相关产品推荐
相关产品推荐

