从Java中的接口ArrayList中拉出某些对象?

时间:2015-08-20 17:39:06

标签: java arraylist

我需要从ArrayList中通过接口键入的几个对象调用一个方法(这里我们称之为接口)。

ArrayList<Interface> obj = new ArrayList();

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

我的问题是o只能看到界面的方法和变量而没有别的。

4 个答案:

答案 0 :(得分:0)

我认为您可能正在寻找instanceof关键字。

if (o instanecof ObjectA) { ...}

那就是usage of instanceof is often indicating a code smell,你的设计应该没有一个没有实现的方法,如果由于某种原因它确实有这样的方法,那就让它抛出异常(NotImplementedException)。

答案 1 :(得分:0)

您可以使用instanceof运算符来确定对象的类型是否正确:

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

请注意,如果instanceof为空,false也会返回o,因此您无需检查该内容。

答案 2 :(得分:0)

首先检查o的类型:

if (o instanecof ObjectA)

然后将o投射到ObjectA

((ObjectA)o).method();

答案 3 :(得分: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