2015-08-20 34 views
1

我需要從一個ArrayList中的幾個對象調用一個方法,這個方法是由一個接口(在這裏我們稱之爲接口)鍵入的。從Java中的接口的ArrayList中提取某些對象?

ArrayList<Interface> obj = new ArrayList(); 

obj.stream().forEachOrdered((o) -> { 
    if (/*If o extends ObjectA then run this next line*/) { 
    o.methodCallNotInTheInterface(); 
     } 
    }); 

我的問題是o永遠只能看到界面,沒有任何其他的方法和變量。

+1

建設應該是' ArrayList obj = new ArrayList <>();'。 (不知道它是否回答了這個問題,沒有真正看過它) – amit

+0

我使用的是Java 1.8,第二個<>是隱含的,不再需要在那裏。但是謝謝你試圖提供幫助^ _^ –

+0

'ArrayList obj = new ArrayList();'在Java 8中生成編譯警告。*你應該*使用'<>'(鑽石運算符)@amit暗示。 –

回答

0

由於您使用的是流,你可以使用一個謂詞來篩選值,您想要然後將函數應用於過濾的值。這個函數只需將值轉換爲所需的類。

考慮數字的下面的列表:

List<Number> list = new ArrayList<>(Arrays.asList(1, new BigDecimal("2.22"), 3l)); 

然後,如果你只需要調用一個方法上BigDecimal情況下,你可以這樣來做:

list.stream() 
    .filter(n -> n instanceof BigDecimal) 
    .map(n -> (BigDecimal) n) 
    .forEachOrdered(n -> System.out.println(n.pow(2))); // 4.9284 
+1

謝謝你。當我找到一個解決方案時,我總是喜歡一種解決方案。 –

0

我想你可能在尋找關鍵詞instanceof

if (o instanecof ObjectA) { ...} 

這就是說,usage of instanceof is often indicating a code smell,和您的設計可能不應該有不落實的,如果由於某種原因,它確實有這樣的方法,使其拋出一個異常(NotImplementedException)的方法。

+0

關於代碼異味鏈接的問題就是這樣,o是一個實現ArrayList輸入接口的對象。 o上的任何方法調用只返回在該接口中聲明的方法,而不是該對象所具有的其他方法。那不應該導致「代碼味道」正確? –

+0

@JoshuaPelino你的意思是接口有一個方法(假設'foo()'和ObjectA',它恰好擴展了'SuperClass',它也有'foo()',並且你想'SuperClass'的' foo()'被調用?如果我沒有記錯的話,在java8中,無論如何你都需要在ObjectA中解析它。 – amit

+0

沒有接口有方法foo(),我試圖調用方法bar() ObjectA –

0

可以使用instanceof運營商來決定你的對象是否是正確的類型:

List<Interface> obj = new ArrayList<>(); 
obj.stream().forEachOrdered(o -> { 
    if (o instanceof ObjectA) { 
     ((ObjectA) o).methodCallNotInTheInterface(); 
    } 
}); 

注意instanceof也返回false如果o爲空,所以你並不需要檢查這一點。

+0

這有點固定它,我的問題最終變成了更愚蠢的東西(我忘記導入那個對象),這就是爲什麼當我早些時候嘗試這個時,它不起作用,我認爲我有錯誤的語法謝謝,雖然你讓我看看我的代碼更密切地聯繫在一起 –

0

首先檢查的o類型:

if (o instanecof ObjectA) 

再投o鍵入ObjectA

((ObjectA)o).method();