当前位置: 首页 > 知识库问答 >
问题:

Java Collections API:缺少List和Deque的序列(有序集合)超级接口?

吕作人
2023-03-14

我需要在下面公开一个API-consume(sequence),它要求它的参数sequence集合按照下面的摘录进行排序:

interface Consumer<T> {
    /**
     * @param sequence: an *ordered* collection of Ts to be processed in order
     */
    public void consume(Collection<T> sequence);
}

interface Producer<T> {
    Collection<T> getSequence();
}

class Producer1<T> implements Producer<T> {
    public List<T> getSequence() {
        return new ArrayList<>();
    }
}
class Producer2<T> implements Producer<T> {
    public Deque<T> getSequence() {
        return new LinkedList<>();
    }
}

class Test {
    void testMethod(Consumer<Long> consumer) {
        consumer.consume(new Producer1<Long>().getSequence());
        consumer.consume(new Producer2<Long>().getSequence());
    }
}

通常,人们会将consume()指定为接受列表;然而,一些生产者也公开了一个Deque,以便于使用DegendingIterator()进行高效的反向迭代。然而,Deque并没有扩展List,这可能有很好的原因(O(n)在LinkedList中访问索引元素的成本)。

因此,“让编译器开心”的唯一方法似乎是将序列指定为Collection;然而,根据Javadoc(众所周知),“有些是有序的,有些是无序的”,因此消耗()API在语学义中失去了作用。

另一种解决方法是让Producer2公开LinkedList,而不是Deque(并恢复consume(),以接受列表),但我们知道,公开实现而不是接口并不理想。

对于Java来说,理想的解决方案似乎是为列表Deque(扩展Iterable)提供一个序列超级接口。我可以想象没有做到这一点的一个原因是复杂性,但我认为这个例子证明了这一点。

我在这里错过了一个更好的策略,还是我只需要等待API的修订?记录在案,这是Java17。


共有1个答案

南门英飙
2023-03-14

OpenJDK邮件列表中恰好有一个关于这个的讨论。你可以在这里找到一个存档:https://mail.openjdk.java.net/pipermail/core-libs-dev/2022-February/085683.html.这也提到了一个JEP:https://openjdk.java.net/jeps/8280836.

在这件事解决之前,恐怕你必须记录下需要订购的藏品,并相信来电者会遵守你的先决条件。

 类似资料:
  • 问题内容: 我找不到使用此方法的任何示例,所有示例都给出了第二个参数“ null”。我听说此方法用于根据多个标准对类进行排序,但找不到示例。 对于本课程,如果我想根据学生的姓名和年龄对学生列表进行排序,如何使用方法Collections sort(List,Comparator) 问题答案: 在你现有的学生班级的基础上,这通常是我的工作方式,尤其是当我需要多个比较器时。 用法: 编辑 自Java

  • 我用Jenkins、nodejs和.NET Core2.0设置了一台Ubuntu16.04机器,然后尝试让它构建我的.NET Core2.0 web应用程序。失败,出现以下消息:

  • 上下文:我在Java中创建了一个BinarySearchTree类作为学习练习,因为我是Java新手。我目前正在为级别顺序遍历(BFS)编写一个方法,该方法返回每个级别的节点值列表,其中顶级列表索引表示级别编号,每个索引处的较低级别列表包含该级别的节点值,例如此树的节点值 levelOrder()方法将返回 问题:在实现中,我声明了一个名为“listOfLevels”的顶级列表来保存级别列表,以及

  • 包装com.company;进口java.io.*; 导入静态com。公司主要的磁盘 公共类存储系统{private static final String FILE_NAME=“D:/Songs.data”; } 无法序列化/反序列化。我有一个应该写入文件然后输出的歌曲列表。我不明白为什么它只读取一首歌。 档案:�Øsrcom。公司歌曲“Ї……ј04јJ L genget Ljava/lang

  • 问题内容: 我正在尝试将.NET DataTable序列化为JSON文件,然后将JSON文件反序列化为DataTable。我想很简单。 但是,我有一个表,3行3列,每个元素的类型都是double。如果第一行中的任何值为null,则当JSON.Net将json文件反序列化为DataTable对象时,第一行中为null的列的所有值都变为字符串。 需要明确的是,只有第一行的值为空时,才会发生这种情况。如

  • 本文向大家介绍JAVA对list集合进行排序Collections.sort(),包括了JAVA对list集合进行排序Collections.sort()的使用技巧和注意事项,需要的朋友参考一下 对一个集合中的对象进行排序,根据对象的某个指标的大小进行升序或降序排序。代码如下: 进行降序排列 进行升序排列 经过测试发现,只需要把两个对象的位置调换一下即可升序或降序。 如果指标相同,根据多个指标进行