我可能搜索不够,但找不到任何答案。
[{[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的灵魂一样。
答案 0 :(得分:3)
我认为您误解了Collection
的概念。由于您已经拥有每个元素,因此没有getAll()
方法。只需使用stream().filter()
语法和collect
或map
即可完成
collection.stream().filter(x -> x..) // do stuff
答案 1 :(得分:0)
我认为您正在寻找Collection.removeIf(Predicate<? super E> filter)
,尽管您需要否定谓词逻辑。或者,您可以使用流:collection.stream().filter(p)
。
关于为什么没有getAll
和其他方法一起使用的原因,我看不到Predicate
参数的来源,如果你过滤掉一些。 addAll
方法将添加所有元素,因此类似的方法getAll
将获取所有元素,这只是集合本身,因此将是多余的。
此外,Collection
甚至根本没有get()
方法。也许您在考虑List.get(int)
。我想您可能有一个类似getAll(int[])
的“全部”版本,该版本返回所有给定索引处的元素,但是当subList(int, int)
已经存在时,这似乎没有太大用处。