gpt4 book ai didi

java - Java 8 中带有实例方法引用的 forEach 的局限性

转载 作者:太空狗 更新时间:2023-10-29 22:32:30 24 4
gpt4 key购买 nike

假设我有以下功能接口(interface):

public interface TemperatureObserver {
void react(BigDecimal t);
}

然后在另一个类中已经填写了ArrayList TemperatureObserver 类型的对象.假设tempBigDecimal ,我可以调用 react在循环中使用:

observers.forEach(item -> item.react(temp));

我的问题:我可以为上面的代码使用方法引用吗?

以下不起作用:

observers.forEach(TemperatureObserver::react);

错误信息告诉我

  1. forEachArraylist observers不适用于 TemperatureObserver::react 类型
  2. TemperatureObserver没有定义方法 react(TemperatureObserver)

很公平,因为forEach期望作为一个参数 Consumer<? super TemperatureObserver> , 而我的界面虽然功能正常,但不符合 Consumer因为 react 的参数不同(在我的例子中是 BigDecimal)。

那么这个能解决吗,还是lambda没有对应的方法引用的情况?

最佳答案

当流中的单个值可用时,可以使用三种方法引用:

  1. 流对象的无参数方法。

    class Observer {
    public void act() {
    // code here
    }
    }

    observers.forEach(Observer::act);

    observers.forEach(obs -> obs.act()); // equivalent lambda

    流式对象成为方法的 this 对象。

  2. 以流对象作为参数的静态方法。

    class Other {
    public static void act(Observer o) {
    // code here
    }
    }

    observers.forEach(Other::act);

    observers.forEach(obs -> Other.act(obs)); // equivalent lambda
  3. 以流对象作为参数的非静态方法。

    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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com