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

标签 java foreach java-8 method-reference

假设我有以下功能接口(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/

相关文章:

jQuery 为每个附加子节点

java - 为什么 java 收集流对每个 getter 运行两次?

将 Lambda 应用于返回另一个列表的列表的 Java 8 惯用方法?

java - 在LWJGL的OpenCL功能中,我从哪里得出 "cl_platform_id"?

java - C和Java中的逻辑差异

javascript - JavaScript 的问题

r - 使用 type = MPI 的 "doParallel"包和直接使用 doMPI 有什么区别?

java - 尝试创建新的 JarFile 时出现 "java.util.zip.ZipException: error in opening zip file"

java - Maven 许可证插件 : Use license for parentPom for all children

java - 从构造函数调用虚方法