2011-12-08 94 views
5

我一直在想Java中的函數,我希望它存在。我想遍歷一個Arraylist(比如A類),它包含B類和C類的對象,它們都擴展了A.這個想法,我只想遍歷(例如)ArrayList中的B類的對象。用擴展類遍歷Arraylist

這是怎麼可能的,就像下面代碼中的簡短例子一樣,沒有那麼長的代碼?

主類:

 import java.util.*; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    Test() { 
     ArrayList<A> a = new ArrayList<A>(); 
     a.add (new B()); 
     a.add (new C()); 
     a.add (new C()); 
     a.add (new B()); 
     a.add (new C()); 
     for (A aObject : a) { // this works, I want it shorter 
      if (aObject instanceof B) { 
       B b = (B) aObject; 
       System.out.println (b.hi); 
      } 
     } 
     for (B b : a) // like this? 
      System.out.println (b.hi); 
    } 
} 

答:

public class A { 

} 

B:

public class B extends A { 
    String hi = "hi"; 
} 

C:

public class C extends A { 

} 

編輯:因爲很多人回答這個問題:我知道使用instanceof。我想回路更快的方式,通過陣列,其中的類B.

中的所有對象
+0

您必須遍歷所有列表以及列表中的每個對象,以檢查它是否是您想要的類。您可能希望查看下面答案中已經聲明的keywork「實例」,但是我擔心代碼將與您所使用的代碼類似(但方法實例更好/更乾淨) – Pitelk

+0

在你編輯它之前的問題並不清楚你要求什麼。 – JRSofty

回答

2

你可以做一個可重複使用的過濾器類,它類似於FileFilter。 (請參閱korifey關於使用番石榴的答案。)除此之外,不,沒有任何現有功能可以做到這一點。此外,任何現有的功能都必須完全按照您的操作進行,因爲List類型無法知道列表中不同類別的對象的位置。 (它必須迭代它們才能找到它們)。

如果您需要一個高性能的解決方案,您可以考慮爲單獨的實例存儲單獨的列表 - 要麼替換或添加到您的當前列表。你甚至可以把它包裝在一個複合類中,通過一個通用的API提供兩個功能(所有實例和類的實例)。

+0

感謝您的回答,我只是好奇,不需要高性能,但也許我會需要它。很好的答案! – Hidde

2

您可以使用guava

像這樣:

for (B b: Iterables.filter(a, B.class)) { 
System.out.println (b.hi); 
} 
+0

這不和OP做同樣的事情:過濾器接受C實例,而OP只接受B不是C的實例。不過,OP可以使用可重用謂詞。 –

+0

C擴展A,而不是B.爲什麼過濾器接受C? – korifey

+0

對不起,我的錯。如果C擴展了B,並且如果OP在他比較類而不是使用instanceof的地方保留了它的原始代碼,那麼就會有區別。 –

0

我同意JRSofty。

for (A aObject : a) { 
    if (aObject instanceof B) { // <-- This is as short I can make it 
     B b = (B) aObject; 
     System.out.println (b.hi); 
    } 
} 
+0

我已經展示了這個例子,沒有instanceof,但是同樣的事情。 – Hidde

0

你可以寫這樣一個簡單的循環:

for (A aObject : a) 
    if (aObject instanceof B) 
     System.out.println(((B) aObject).hi); 

這是使用instanceof運營商更好的主意。但是,爲了過濾不屬於B類型的列表實例,您需要集成額外的集合庫,因爲該操作不直接由標準集合API支持。也許GuavaLambdaJ支持你想要做的那種過濾操作,我還沒有檢查過。