java - 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。将其修复为列表的当前大小解决了这个问题。谢谢你们!
解决方案
您可以使用以下方法自定义supplier
javacollect
流Collector.of
:
myCustomList = myCustomList.stream()
.sorted(Comparator.comparing(user::getId))
.collect(Collector.of(CustomLinkedList::new, CustomLinkedList::addNewElement, (list1, list2) -> list1.mergeWith(list2)));
Collector.of
有三个参数:
- 在您的情况下使用的供应商
CustomLinkedList
。 - 如何向您的供应商添加元素的功能。
- 返回两个合并不同结果的函数,
CustomLinkedList
list1
在list2
我的示例中,使用并行流处理时需要此函数。
有关示例的更多详细信息,请参见此链接。
推荐阅读
- r - toJSON 转换问题
- python - 我是否在我的神经网络中错误地标记了我的数据?
- java - 我可以用这个 OpenJDK 64-Bit Server VM 警告做点什么吗?
- javascript - DiscordJS 发送嵌入 DM
- python - 字符串匹配和存储在字典中
- python - 命令:在redis集群模式下WAIT被阻塞
- ios - “npx cap add ios”失败并出现错误“使用 pod install 更新 iOS 本机依赖项 - 失败!”
- javascript - 阻止用户进入个人资料页面
- datatables - 在 jQuery DataTables 中使用 fnFooterCallback 添加第三总行
- ios - 屏幕录制和麦克风打开时 AVAssetWriter 崩溃