簡體   English   中英

從Java接口的ArrayList中提取某些對象?

[英]Pull out certain objects from an ArrayList of Interfaces in Java?

我需要從一個由接口鍵入的ArrayList中的一些對象中調用一個方法(這里我們將其稱為接口)。

ArrayList<Interface> obj = new ArrayList();

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

我的問題是o只能看到接口的方法和變量,而沒有其他東西。

我認為您可能正在尋找關鍵字的instanceof

if (o instanecof ObjectA) { ...}

也就是說, instanceof使用通常表示代碼有氣味 ,您的設計可能不應該包含未實現的方法,並且如果由於某種原因它確實具有這樣的方法,請使其拋出異常( NotImplementedException )。

您可以使用instanceof運算符來確定您的對象是否為正確的類型:

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

請注意,如果o為null, instanceof也將返回false ,因此您無需進行檢查。

首先檢查o的類型:

if (o instanecof ObjectA)

然后將o轉換為ObjectA類型:

((ObjectA)o).method();

使用流時,可以使用謂詞過濾所需的值,然后將函數應用於過濾后的值。 該函數將簡單地將值轉換為所需的類。

考慮以下數字列表:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM