【问题标题】:Java Streams: modifying return collection to a custom type with Collectors.toCollectionJava Streams:使用 Collectors.toCollection 将返回集合修改为自定义类型
【发布时间】:2020-09-23 21:23:24
【问题描述】:

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

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

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

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

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

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

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


更新:

根据 Ismail 的提议,我设法实现了 Collector.of,如下所示:

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

但现在我收到以下错误:

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


解决方案:

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

【问题讨论】:

  • 你能告诉我们你的 CustomLinkedList 类吗?
  • @Ismail 用列表实现的链接更新了问题
  • 出现新问题后,您应该将所有信息都放在帖子中,而不是滴灌信息。 CustomLinkedList的实现在哪里?
  • @George 问题中有一个指向我正在使用的自定义链表的链接,也许你错过了?
  • @George 支持你提醒我下次看起来更好。用解决方案更新了问题

标签: java java-stream doubly-linked-list


【解决方案1】:

您可以使用Collector.ofcollect java 流自定义supplier

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. 返回两个不同CustomLinkedListlist1list2合并结果的函数,在我的例子中,这个函数在使用并行流处理时是必须的。

有关示例的更多详细信息,请参阅link

【讨论】:

  • 那么如何处理CustomLinkedList::addNewElement中的静态引用呢?我不知道如何实现这个
  • 在您的情况下,您可以将 addNewElement 替换为 addFirst 或 addLast。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多