繁体   English   中英

Java 供应商<> 定义为 lambda。 需要帮助了解此代码甚至如何运行

[英]Java Supplier<> defined as lambda. Need help understanding how this code even runs

抱歉,标题有点不清楚,但希望您很快就会看到,想出一个更好的标题并不容易:)

所以我有这个接口,它通过定义一个新方法和 Supplier.get() 方法的默认实现来扩展 Java 供应商 @FunctionalInterface。 我的 .get() 的默认实现仅在某些异常处理中包装了对其他方法的调用。

然后在我的代码中,我使用 lambda 符号初始化了这个供应商的不同“版本”。 例如: SomeSupplier s = () -> doSomething();

不知道为什么我什至尝试过这个,因为从逻辑上讲,我不明白这甚至是如何工作的。 在我看来,当我像这样使用 lambda 定义我的供应商时,我实际上是在覆盖 Supplier.get() 方法。 那么在实践中它是如何覆盖我的 SomeSupplier.getSome() 方法的呢? 并保留 .get() 方法的默认实现?

我在这里缺少什么?


工作示例代码:


    public static void main(String[] args) throws InterruptedException {

        SomeSupplier s = () -> getSomeOrException(); // "implements" the Supplier.get(), right?

        for (int i = 0; i < 100; i++) {
            System.out.println(s.get()); // => "Some!" or "null"
            Thread.sleep(2);
        }
    }

    private static String getSomeOrException() throws SomeCheckedException {
        if (System.currentTimeMillis() % 10 == 0) {
            throw new SomeCheckedException("10 %!");
        }
        return "Some!";
    }

    private interface SomeSupplier extends Supplier<String> {

        @Override
        default String get() {
            try {
                return getSome();
            }
            catch (SomeCheckedException e) {
                return e.getMessage();
            }
        }

        String getSome() throws SomeCheckedException; // How is this overridden/implemented?
    }

    private static class SomeCheckedException extends Exception {
        public SomeCheckedException(String message) {
            super(message);
        }
    }
}```

您的错误是假设如果Supplier的 Lambda 实现了get那么SomeSupplier的 lambda 也必须实现get

但相反,Lambda 将始终实现接口的单一抽象方法*它即将实现。 Supplier ,这是get 但是,您的SomeSupplier实现get (使用default方法)。 因此getSome()成为功能接口SomeSupplier的单一抽象方法。 所以这一行:

SomeSupplier s = () -> getSomeOrException();

大致类似于这个:

SomeSupplier s = new SomeSupplier() { 
    String getSome() throws SomeCheckedException() {
        return getSomeOrException();
    }
};

请注意,这实现了getSome而不是底层的get方法。

*:这也是函数式接口只能有一个抽象方法的原因:如果给定目标类型存在多个这样的方法,则没有回退逻辑来选择一个选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM