【发布时间】: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