静态方法中的Lamba如何实例化接口

问题描述

由于公司和个人的惯性,我从事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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...