在Java中,如何检查集合是否包含特定类的实例?

Phi*_*sby 14 java generics

例如(这是非常简化的),假设我在一副牌中有一个KingOfSpaces类,例如一个类,一个QueenOfSpades类,一个JackOfDiamonds类等等.所有这些都扩展了Card.可能有多个实例KingOfSpaces.

我有一个ArrayList<Card>,里面有5个物体.如何查看是否ArrayList至少包含一个AceOfDiamonds

Kev*_*Day 14

让我们首先指出,使用类进行这种区分几乎肯定是一件坏事.我要说你可能需要让'Card'更聪明一些(即使用getSuit()和getOrdinal()方法).

但是,如果你坚持这样做,迭代数组列表(你可以google - 这是一个非常基本的东西)并使用instanceof运算符比较列表中的每个条目.

您将此问题标记为与"反射"有关,这似乎并不正确.你确定你不打算把它作为"家庭作业"吗?

好的 - 到底是什么,这是代码:

List<Card> hand = ...;
for(Card card : hand){
  if (card instanceof AceOfDiamonds) return true;
}
Run Code Online (Sandbox Code Playgroud)

但请不要设置你的班级层次结构 - 这是一个可怕的设计.


Mel*_*Mel 9

现在,您可以以一种非常简单的单行方式对流执行此操作:

List<Card> myList = fillitSomehow();
myList.stream().anyMatch(c -> c instanceof AceOfDiamonds);
Run Code Online (Sandbox Code Playgroud)

  • 或者 `.anyMatch(AceOfDiamonds.class::isInstance)` (2认同)

Rei*_*ica 6

@Daniel Pereira 按要求回答了问题。我想建议您真正想要的是enum.

例子:

enum Card {
    KingOfSpades,
    QueenOfSpades,
    JackOfSpades,
    // etc
    AceOfDiamonds;
}

Card myCard = ...;
if(myCard == Card.KingOfSpades) {
    // stuff
}

Set<Card> cards = new EnumSet<Card>(Card.class);
cards.add(...);
if(cards.contains(myCard)) {
   // stuff
}
Run Code Online (Sandbox Code Playgroud)