问题描述
由于公司和个人的惯性,我从事Java已有一段时间了,主要是Java 1.7。 最近,我决定开始学习一些有关Java的功能方面的知识,因此我开始使用Function接口并构建一个 Validator ,该对象将检查 Map是否符合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);
}
我一直在寻找,我一直在努力寻找答案
解决方法
您提供了那些静态方法的实现。例如;当您创建resource -> resource.containsKey(property)
的lambda时,您实际上所做的是;
return new ResourceValidator() {
@Override
public Boolean apply(Map<String,String> resource) {
return resource.containsKey(property);
}
};
您实现了apply
函数的ResourceValidator
(是Function
接口的子类型,被标记为功能接口)。
所以现在您可以像调用它一样
ResourceValidator.containsProperty("foo").apply(Map.of("foo","bar"));
您可能遇到过Java lambda表达式。否则,这是非常全面的https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html,