java - Java 供应商<> 定义为 lambda。需要帮助了解此代码甚至如何运行
问题描述
很抱歉标题有点不清楚,但希望你很快就会看到,想出一个更好的标题并不容易:)
所以我有这个接口,它通过定义一个新方法以及 Supplier.get() 方法的默认实现来扩展 Java Supplier @FunctionalInterface。我默认的 .get() impl 仅在某些异常处理中包装对另一个方法的调用。
然后在我的代码中,我使用 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 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);
}
}
}```
解决方案
您的错误是假设如果 a 的 LambdaSupplier
实现,get
则 a 的 lambdaSomeSupplier
也必须实现get
。
但相反,Lambda 将始终实现接口的单个抽象方法*它即将实现。在Supplier
那get
。但是,您SomeSupplier
已经实现 get
了(使用default
方法)。因此getSome()
成为功能接口的单一抽象方法SomeSupplier
。所以这一行:
SomeSupplier s = () -> getSomeOrException();
大致类似于此:
SomeSupplier s = new SomeSupplier() {
String getSome() throws SomeCheckedException() {
return getSomeOrException();
}
};
请注意,这是实现getSome
而不是底层get
方法。
*:这也是为什么函数式接口只能有一个抽象方法的原因:如果给定目标类型存在多个这样的方法,则没有回退逻辑来选择一个选项。
推荐阅读
- amazon-web-services - 无服务器中基于资源的策略
- assembly - 如何使用 SWORD PTR(汇编语言)打印负整数
- javascript - 在图像的单击坐标上动态添加文本框
- javascript - react-native-video 如何在视口中重置视频和自动播放?
- python - 当我在每次循环迭代开始时将列表分配回空时,列表如何附加数据
- sql - SQLAlchemy - 查询现有项目的关联表
- android - 将应用程序 apk 和短信发送到 WhatsApp 的代码
- python - 标准缩放它在 pyspark 数据帧中花费了太多时间
- flutter - 如何使用 dio 和 file_picker 包上传多个文件服务器,
- angular - 护照无法在未定义角度全局的情况下运行