Supplier:JavaSupplier<>定义为lambda 需要帮助了解此代码如何运行

关于Supplier的问题,在supplier java中经常遇到, 对不起,有点不清楚的标题,但希望你很快就会看到,它不是那么容易想出一个更好的:)

对不起,有点不清楚的标题,但希望你很快就会看到,它不是那么容易想出一个更好的:)

所以我有这个接口,通过定义一个新方法和一个默认的实现来扩展 Java Supplier @ FunctionalIntece。get()方法。

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

不知道为什么我甚至尝试过这个,因为从逻辑上讲,我不明白这是如何工作的,它确实如此。在我的脑海中,当我使用 lambda 这样定义我的供应商时,我基本上覆盖了 Supplier.get () 方法。那么,在实践中它似乎如何覆盖我的 SomeSupplier.getSome () 方并保留.get () 方法的默认 impl 不变?

我在这里错过了什么?

工作示例代码:


    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 intece 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);
        }
    }
}```
6

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

但是,Lambda 将始终实现将要实现的接口*的单个抽象方法。在Supplier中,即get。但是,您的SomeSupplier具有实现的get(使用default方法)。因此getSome()

SomeSupplier s = () -> getSomeOrException();

大致类似于此:

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

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

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

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(162)
写代码需要什么软件:我需要什么软件来创建闪存文件
上一篇
Pdf文件压缩到指定大小:有没有办法使用Java将PDF压缩到小尺寸
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(37条)