当前位置: 首页 > 知识库问答 >
问题:

该方法引用的有效方法是什么?幕后发生了什么?

贺亦
2023-03-14

我有一个以下程序

import java.util.Scanner;

@FunctionalInterface
interface Retry {

    int run(Runnable action, int maxAttempts, long delayBeforeRetryMs);
}

final class RetryUtils {
    public static Retry retry= RetryUtils::retryAction; // assign the retryAction method to this variable

    private RetryUtils() { }

    public static int retryAction(
            Runnable action, int maxAttempts, long delayBeforeRetryMs) {

        int fails = 0;
        while (fails < maxAttempts) {
            try {
                action.run();
                return fails;
            } catch (Exception e) {
                System.out.println("Something goes wrong");
                fails++;
                try {
                    Thread.sleep(delayBeforeRetryMs);
                } catch (InterruptedException interruptedException) {
                    throw new RuntimeException(interruptedException);
                }
            }
        }
        return fails;
    }
}

class Retrying {
    private static final int MAX_ATTEMPTS = 10;
    private static final long DELAY_MS = 1;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        RetryUtils.retry.run(() -> System.out.println(scanner.nextLine()), MAX_ATTEMPTS, DELAY_MS);
    }
}

我看到方法retryAction返回int。那么公共静态Retry retry=RetryUtils::retryAction;是如何对Retry类型的对象进行有效分配的?这是如何编译的?幕后发生了什么?

共有1个答案

敖子安
2023-03-14

期望int作为返回类型不是函数调用。它是一个lambda表达式,它创建了Retry接口的匿名实现。它几乎等于这个

 public static Retry retry= new Retry(){
     int run(Runnable action, int maxAttempts, long delayBeforeRetryMs)
     RetryUtils.this.retryAction(action,maxAttemps,delayBeforeRetryMs)
}

由于静力学的原因,这个类比几乎是准确的,但你应该明白这个道理。

 类似资料:
  • 问题内容: 给定一个表(daily_sales),其中包含以下数据/列的10万行: 编写报告(使用SQL完整显示所有名称的两个最新条目(代表,销售,日期))的最有效方法是什么,因此输出将是: 谢谢! 问题答案: 对于MySQL,在 @Quassnoi的博客 中进行了解释,该索引是使用和使用的:

  • 问题内容: 好吧,我有两个StringBuilder对象,我需要在Java中对其进行比较。我知道我可以做的一种方法是 但这意味着我要创建两个String对象,还有没有更好的方法来比较StringBuilder对象。也许您不需要创建其他对象的地方? 问题答案: 如您所知,继承自,因此仅在将同一对象作为参数传递时才返回true。它并 没有 比较两个内容小号! 如果您查看源代码,您将得出结论,最有效的比

  • 问题内容: 我下面有这个简单的程序 请注意,我使用的是值,而不是指针。但是sync包的页面指定,和函数采用。 为什么/如何运作? 问题答案: 的设定方法的是空的方法集: 输出(在Go Playground上尝试): 这是因为所有方法都具有指针接收器,因此它们都是该类型的方法集的一部分。 当您这样做时: 这实际上是的简写,等等。 这是在规范中:致电: 如果是可寻址且方法集包含,则为的简写。 因此,当

  • 问题内容: 我正在尝试使用以下代码来理解: 产生输出: 什么是和这里?文档说明中说: 返回指定的文字模式。 此方法产生一个,可用来创建一个与字符串相匹配的,就好像它是文字模式一样。 输入序列中的元字符或转义序列将没有特殊含义。 但是的返回类型不是编译对象。 为什么需要此方法?使用示例有哪些? 问题答案: 表示“文字文本的开始”(即正则表达式“开引号”) 表示“文字文本的结束”(即正则表达式“闭引号

  • 问题内容: 有一些方法,例如搜索重复项,但我想知道对于此任务是否有更好的解决方案。 问题答案: 您可以为此使用。