静态方法中的Lambda如何实例化接口
How the Lamba in static method instantiates the interface
由于公司和个人惯性,我已经做了 java 一段时间了,主要是 java 1.7。
最近我决定开始更多地学习函数方面的知识 o java,所以我开始使用 Function 接口并构建一个 Validator 来检查 如果地图符合验证器标准。
这样就可以像
一样以编程方式构建验证器
Usage:
Map<String, String> book = new LinkedHashMap<String, String>();
book.put("Title", "Leviathan Wakes");
book.put("Subject", "A proto molecule");
book.put("Category", "sci-fi");
book.put("TotalPages", "350")
final ResourceValidator filter = ResourceValidator.containsProperty("Title").and(ResourceValidator.containsProperty("Category"));
assert filter.apply(book);
这是我生成的代码
public interface ResourceValidator extends Function<Map<String,String>,Boolean> {
static ResourceValidator containsProperty(String property) {
return resource -> resource.containsKey(property);
}
default ResourceValidator and(ResourceValidator other){
return resource -> this.apply(resource) && other.apply(resource);
}
}
到目前为止,它的行为似乎符合预期,但我不明白的是接口是如何被实例化的。
调用
final ResourceValidator filter = ResourceValidator.containsProperty("Title");
调用接口的静态方法,ResourceValidator在静态方法中如何以及在何处实例化?
static ResourceValidator containsProperty(String property) {
return resource -> resource.containsKey(property);
}
我一直在寻找并且正在努力寻找答案
您提供了这些静态方法的实现。例如;当您将 lambda 创建为 resource -> resource.containsKey(property)
时,您实际上所做的是;
return new ResourceValidator() {
@Override
public Boolean apply(Map<String, String> resource) {
return resource.containsKey(property);
}
};
你实现了ResourceValidator
函数的apply
(是Function
接口的子类型,标记为函数式接口)。
所以现在您可以调用它了;
ResourceValidator.containsProperty("foo").apply(Map.of("foo", "bar"));
您可能遇到过 Java lambda 表达式。不然这个还是挺全面的https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html,
由于公司和个人惯性,我已经做了 java 一段时间了,主要是 java 1.7。 最近我决定开始更多地学习函数方面的知识 o java,所以我开始使用 Function 接口并构建一个 Validator 来检查 如果地图符合验证器标准。 这样就可以像
一样以编程方式构建验证器Usage:
Map<String, String> book = new LinkedHashMap<String, String>();
book.put("Title", "Leviathan Wakes");
book.put("Subject", "A proto molecule");
book.put("Category", "sci-fi");
book.put("TotalPages", "350")
final ResourceValidator filter = ResourceValidator.containsProperty("Title").and(ResourceValidator.containsProperty("Category"));
assert filter.apply(book);
这是我生成的代码
public interface ResourceValidator extends Function<Map<String,String>,Boolean> {
static ResourceValidator containsProperty(String property) {
return resource -> resource.containsKey(property);
}
default ResourceValidator and(ResourceValidator other){
return resource -> this.apply(resource) && other.apply(resource);
}
}
到目前为止,它的行为似乎符合预期,但我不明白的是接口是如何被实例化的。 调用
final ResourceValidator filter = ResourceValidator.containsProperty("Title");
调用接口的静态方法,ResourceValidator在静态方法中如何以及在何处实例化?
static ResourceValidator containsProperty(String property) {
return resource -> resource.containsKey(property);
}
我一直在寻找并且正在努力寻找答案
您提供了这些静态方法的实现。例如;当您将 lambda 创建为 resource -> resource.containsKey(property)
时,您实际上所做的是;
return new ResourceValidator() {
@Override
public Boolean apply(Map<String, String> resource) {
return resource.containsKey(property);
}
};
你实现了ResourceValidator
函数的apply
(是Function
接口的子类型,标记为函数式接口)。
所以现在您可以调用它了;
ResourceValidator.containsProperty("foo").apply(Map.of("foo", "bar"));
您可能遇到过 Java lambda 表达式。不然这个还是挺全面的https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html,