静态方法中的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,