Java Collection 接口没有使用谓词的直接 allMatch、anyMatch 和 noneMatch API 是否有原因

lmk*_*lmk 5 java collections java-stream java-11

我想知道 Java Collection接口没有使用类似于Stream接口上的谓词allMatch()的直接, anyMatch()& noneMatch()API是否有原因。

在我看来,除了不需要使用 Streams 来执行这些操作之外,将这些放在 Collection 接口上(也)将为我们带来与其他 Collection 接口方法(甚至)contains()相同containsAll的优势。removeIf

我本来打算使用一个薄包装实用程序来实现此目的,但想听听上述人士的意见……这是否只是 OpenJDK 社区考虑到工作负载的优先事项,或者是否涉及其他设计考虑因素。

谢谢

Don*_*aab 10

  1. “减少冲突面。” -Brian Goetz,2012 年 9 月,lambda-libs-spec-experts 邮件列表。

像这样已经存在了二十多年的接口引入的默认方法越多Collection,扩展这些接口的其他第三方库或应用程序就越有可能出现问题。

我是Eclipse Collections库的创建者,多年来必须修复由添加到现有接口的新默认方法造成的 3 次中断,并且在 JDK 21 中,新接口被默认添加到 Collection 层次结构中方法。多年来我们遇到冲突并不得不修复并发布新版本 Eclipse Collections 的默认方法是:

  • sort- 添加为ListJDK 8 中接口的默认方法
  • isEmptyCharSequence- 添加为JDK 15 中接口的默认方法
  • getFirst, - JDK 21 中通过JEP 431 的getLast默认方法SequencedCollection

更新(2023 年 7 月 8 日) - 看来我们在使用 JDK 21SequencedCollection接口的 Eclipse Collections 中遇到的问题只是编译问题,不需要新版本的 Eclipse Collections 即可与 JDK 21 配合使用。

我在参与 OpenJDK 质量推广计划的好处中写了其中的一些内容。sort我们在开源 GS Collections(现在是 Eclipse Collections)之前能够修复该方法。sort方法返回后导致的问题就更麻烦了void。我们必须将我们的方法重命名为sortThis,它返回对正在排序的对象的引用MutableList

Stuart Marks写了一篇很棒的文章,详细解释了 Eclipse CollectionsCharSequence.isEmpty添加为默认方法时遇到的问题。阅读此博客将有助于解释向接口添加新的默认方法时可能出现的一些挑战。对于任何使用新的默认方法扩展现有接口的库来说,这些挑战也存在。将新的默认方法添加到 JDK 中的现有接口时要非常小心。OpenJDK 质量小组的警告社区发出了有关SequencedCollectionJDK 21 中新界面中新默认方法的提示。

注意:Eclipse Collections 具有名为anySatisfyallSatisfy、的方法noneSatisfyanyMatch如果将, ,作为默认方法添加到 Eclipse Collections 中allMatch,则不会出现编译问题。这并不意味着如果添加这些方法,其他库就不会遇到潜在问题。noneMatchjava.util.Collection

  • 唐,我很确定布莱恩电子邮件中的“嗨,唐”是针对您的。:-) (6认同)
  • 第一个链接中写得很棒。“嗨,唐”是针对你的吗? (2认同)
  • 我是 JSR 335 专家组和 lambda-libs-spec-experts 邮件列表的成员,并且我通过 Eclipse Collections(当时称为 GS Collections)实现了自己的集合。这也可能是对另一位唐的问候。 (2认同)