我需要从ArrayList
中通过接口键入的几个对象调用一个方法(这里我们称之为接口)。
ArrayList<Interface> obj = new ArrayList();
obj.stream().forEachOrdered((o) -> {
if (/*If o extends ObjectA then run this next line*/) {
o.methodCallNotInTheInterface();
}
});
我的问题是o
只能看到界面的方法和变量而没有别的。
答案 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