【问题标题】:Why Collection dont have and getAll method? [closed]为什么 Collection 没有和 getAll 方法? [关闭]
【发布时间】:2019-03-26 16:36:26
【问题描述】:

我可能搜索不够,但我没有找到任何答案。

[[Collection]<T>][1] 有一个T get() 方法、一个void add(T t) 方法和一个void addAll(Collection<? extends T> c) 方法。

那为什么我们没有Collection<? extends T> getAll(Predicate<? extends T> p) 方法呢?

我知道创建一个实现它的子类并不难。但我不明白为什么它还不是他们的。

后期编辑:

这里是怀疑论者的具体例子。

我必须编码:

            wellsDisplayers = new ArrayList<DisplayWell>(Arrays.asList(displayerList.stream().filter(x->DisplayWell.class.isInstance(x)).toArray(DisplayWell[]::new)));

而不是:

wellsDisplayers = displayerList.getAll(x->DisplayWell.class.isInstance(x));

但是你说得对,流方法真的很容易使用和理解,就像 java 的灵魂一样。

【问题讨论】:

  • 集合 IS 的所有元素。您将getAll() 的结果放在另一个集合中的什么位置?
  • 是的,你返回一个集合
  • 他们有:collection.stream().filter(predicate).collect(toList())。它有点冗长,但它可以让你做很多其他的事情,而不仅仅是过滤,它还可以让你选择要创建的集合。
  • 一个人应该始终注意不要高估其他人会发现方法的有用性:向接口添加新方法具有非常高的维护成本;而且,就个人而言,这不是我曾经错过的方法。如果您发现自己经常需要这样的东西,请为自己编写一个实用方法。
  • 如果添加一个 filter() 方法(这将是这种方法的正确名称),那么为什么不添加同样有用的 map()、flatMap?它会使 API 变得混乱,Java 设计者更喜欢将所有集合转换方法留在 Stream 中(这是惰性的,因此在组合操作时更有效),以及集合本身中的所有集合变异方法。但这是口味和一致性的问题。他们本来可以的。例如,Kotlin 集合有一个 filter() 方法。

标签: java collections


【解决方案1】:

我认为您误解了Collection 的概念。没有getAll() 方法,因为您已经拥有了所有元素。只需使用stream().filter() 语法和collectmap 即可执行任何操作,例如

collection.stream().filter(x -> x..) // do stuff

【讨论】:

  • 对于 java 7,我会说 Ok。但是 removeIf 的添加看起来与您对 Collections 的看法相矛盾。
  • @JulienMaret 流是 Java 8,而不是 7。 removeIf/add 有意义,可以删除集合的对象或获取集合中的对象。 getAll 来获取你已经拥有的集合是没有意义的。它会返回“this”吗?还是希望它返回一个数组?
  • @JulienMaret 流和谓词仅在 Java 8 之后才可用。想想里面有元素的桶。您的getAll 意味着将桶传递给您已经可以做的下一个人。这就是我所说的集合的概念
  • @MuratKaragöz 没错,那种......(对不起,我不得不用法语表达,它太适合了)“passé le bébé”(送出婴儿)。另一方面,如果我错了,请纠正我,但 java 是一种高级编程语言,它假装尽可能容易阅读和快速理解。它将为用户创建一种别名(redondant 但清晰)。无论如何,您是对的,过滤器提供了更多可能性,因此更适合“响应式”编程。
  • @dustytrash 我说了算。 Java 7 不在这里。想法不是拥有所有集合,而是拥有尊重条件的元素的 subCollection。 “获取所有正元素”、“获取所有对元素”、“获取所有以 w 开头的元素”。因为每次迭代所有集合有点重(我首先不知道 .stream.filter() )。而且因为它没有被添加在我看来很奇怪,而且我知道他们可能是一个很好的理由,所以我问这个问题是为了知道这个理由。
【解决方案2】:

我认为您正在寻找Collection.removeIf(Predicate&lt;? super E&gt; filter),尽管您需要否定谓词逻辑。或者,您可以使用流:collection.stream().filter(p)

至于为什么没有getAll 与其他方法一起使用,我看不出Predicate 参数来自哪里,如果你过滤掉一些,你不会得到“全部” . addAll 方法添加了所有元素,所以类比方法getAll 将获取所有元素,这只是集合本身,所以它是多余的。

另外,Collection 首先甚至没有 get() 方法。也许你在想List.get(int)。我想你可以有一个像getAll(int[]) 这样的“全部”版本,它返回所有给定索引处的元素,但是当subList(int, int) 已经存在时,这似乎不是很有用。

【讨论】:

  • Collection.removeIf 仅在 java 8 之后才可用。但这可以替代是的,即使它修改了 Collection 而不是创建新的 Collection。在 Someway You 中,我的观点是,在现有类中添加新方法并非不可能。
猜你喜欢
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 2011-10-21
  • 1970-01-01
相关资源
最近更新 更多