Java:仅从集合中选择提供类型的元素

gla*_*666 4 java collections

我有一个B和C类型的元素集合,它们都扩展了A.我需要过滤集合以获得只有B类型的元素.

有没有办法做到这一点,除了:

for (A a : initCollection) {
  if (a instanceof B) {
    newCollection.add(a)?
  }
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Kev*_*ion 11

番石榴在其他答案中被提及,但不是特定的解决方案,这比人们意识到的更简单:

Iterable<B> onlyBs = Iterables.filter(initCollection, B.class);
Run Code Online (Sandbox Code Playgroud)

它简单而干净,做正确的事情,只创建一个实例并且不复制任何内容,并且不会引起任何警告.

(但是,该Collections2.filter()方法没有这种特殊的重载,所以如果你真的需要一个Collection,你必须提供Predicates.instanceOf(B.class),结果集合仍然可能是类型Collection<A>.)

  • 请注意,使用此解决方案,每次遍历overBs时,都将执行过滤逻辑.这可能是一件好事(如果更新initCollection并且你只想要B反映更改)或者是坏事(如果你期望一个副本,或者只将B.s传递给一些迭代多次的代码).如果你想要一个副本,只需从filter()的输出创建一个集合. (2认同)