首页 > 解决方案 > Java Streams:使用 Collectors.toCollection 将返回集合修改为自定义类型

问题描述

如何将返回集合修改为自定义类型?
我有一个自定义的链表对象,我想在对其进行某种类型的操作后替换它。

这是我想要实现的一个简单示例:

myCustomList = myCustomList.stream()
                           .sorted(Comparator.comparing(user::getId))
                           .collect(Collectors.toCollection(CustomLinkedList::new))

CustomlinkedList::new我从这段代码中得到以下错误。

方法参考中的错误返回类型:无法将 CustomLinkedList 转换为 java.util.Collection

我想我可以将它转换为默认的 LinkedList 对象,对其进行迭代并将节点一一添加到我的 customLinkedList 实现中,但这对我来说并不是一个干净的解决方案。

这是我正在使用的 customList 的链接:customLinkedList
有没有办法解决这个问题?


更新:

根据伊斯梅尔的建议,我设法得到这样的实施Collector.of

.collect(Collector.<T, CustomLinkedList<T>>of(
                                     CustomLinkedList::new, 
                                     CustomLinkedList::add, 
                                     CustomLinkedList::cloneInto));

但现在我收到以下错误:

java.lang.ArrayIndexOutOfBoundsException:索引 0 超出长度 0 的范围


解决方案:

我完全忘记了我使用的是设置大小为 0 的 Spliterators.spliterator。将其修复为列表的当前大小解决了这个问题。谢谢你们!

标签: javajava-streamdoubly-linked-list

解决方案


您可以使用以下方法自定义supplierjavacollectCollector.of

myCustomList = myCustomList.stream()
                           .sorted(Comparator.comparing(user::getId))
                           .collect(Collector.of(CustomLinkedList::new, CustomLinkedList::addNewElement, (list1, list2) -> list1.mergeWith(list2)));

Collector.of有三个参数:

  1. 在您的情况下使用的供应商CustomLinkedList
  2. 如何向您的供应商添加元素的功能。
  3. 返回两个合并不同结果的函数,CustomLinkedList list1list2我的示例中,使用并行流处理时需要此函数。

有关示例的更多详细信息,请参见此链接


推荐阅读