我应该如何在方法的参数中定义 lambda?

How should I define a lambda in my method's arguments?

我有以下自定义 Runnable:

class RandomSum extends Runnable {

   public void run() {
     float sum - 0;
     for(int i = 0; i<1000000;i++){
       sum+=Math.random();
     } 
   }
}

我想 运行 那样:


  RandomSum s =new RandomSum();
  s.retrieveCallback((sum)->{
    System.out.println(sum);
  });
  Thread thread = new Thread();
  thread.start();

但我不知道我应该如何在接受 lambda 的 RandomSum 中定义方法 retrieveCallback

您显示的 lambda 的一种可能 目标类型Consumer。定义一个方法 setCallback 接受一个 Consumer<Float> 并将其存储为一个实例变量。然后在 for 循环之后调用它。

class RandomSum implements Runnable {
    Consumer<Float> callback;
   
    public void setCallback(Consumer<Float> callback) {
        this.callback = callback;
    }

    public void run() {
        float sum = 0;
        for(int i = 0; i<1000000;i++){
            sum += Math.random();
        } 
        callback.accept(sum);
    } 
}

来电方

RandomSum s =new RandomSum();
s.setCallback((sum)->{
    System.out.println(sum);
});

或者使用方法引用,

s.setCallback(System.out::println);

最好在构造函数中传递回调。

您可以在 RandomSum 内定义 retrieveCallback 如下:

public void retrieveCallback(FeedbackHandler feedbackHandler) {
    int sum = ...; // Get the value however you like.
    feedbackHandler.handleFeedback(sum);
}

然后将这个FeedbackHandler接口定义为:

public interface FeedbackHandler {
    void handleFeedback(int sum);
}

当您将 lambda (sum) -> {...} 传递给 retrieveCallback 时,基本上会发生什么:

retrieveCallback(new FeedbackHandler() {
    @Override
    public void handleFeedback(int sum) {
        ...
    }
});