假设我有以下功能接口(interface):
public interface TemperatureObserver {
void react(BigDecimal t);
}
然后在另一个类中已经填写了ArrayList
TemperatureObserver
类型的对象.
假设temp
是 BigDecimal
,我可以调用 react
在循环中使用:
observers.forEach(item -> item.react(temp));
我的问题:我可以为上面的代码使用方法引用吗?
以下不起作用:
observers.forEach(TemperatureObserver::react);
错误信息告诉我
-
forEach
在Arraylist observers
不适用于TemperatureObserver::react
类型 -
TemperatureObserver
没有定义方法react(TemperatureObserver)
很公平,因为forEach
期望作为一个参数 Consumer<? super TemperatureObserver>
, 而我的界面虽然功能正常,但不符合 Consumer
因为 react
的参数不同(在我的例子中是 BigDecimal
)。
那么这个能解决吗,还是lambda没有对应的方法引用的情况?
最佳答案
当流中的单个值可用时,可以使用三种方法引用:
流对象的无参数方法。
class Observer { public void act() { // code here } } observers.forEach(Observer::act); observers.forEach(obs -> obs.act()); // equivalent lambda
流式对象成为方法的
this
对象。以流对象作为参数的静态方法。
class Other { public static void act(Observer o) { // code here } } observers.forEach(Other::act); observers.forEach(obs -> Other.act(obs)); // equivalent lambda
以流对象作为参数的非静态方法。
class Other { void act(Observer o); } Other other = new Other(); observers.forEach(other::act); observers.forEach(obs -> other.act(obs)); // equivalent lambda
还有一个构造函数引用,但这与这个问题并不相关。
因为你有一个外部值temp
,并且你想使用一个方法引用,你可以做第三个选项:
class Temp {
private final BigDecimal temp;
public Temp(BigDecimal temp) {
this.temp = temp;
}
public void apply(TemperatureObserver observer) {
observer.react(this.temp);
}
}
Temp tempObj = new Temp(temp);
observers.forEach(tempObj::apply);
关于java - Java 8 中带有实例方法引用的 forEach 的局限性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43957685/