首页 > 解决方案 > 泛型方法作为使用 java.util.Function 的函数式编程

问题描述

我不确定我们是否可以使用 Java 8 lamda 表达式将泛型方法编写为函数编程,如下所示

通用方法

public <T> MongoCollection<T> getCollection(String collectionName, Class<T> typeParameterClass) {
    return mongoClient
            .getDatabase(mongodbConfiguration.getDatabase())
            .getCollection(collectionName, typeParameterClass);
}

我想将此通用方法转换为通用功能 lamda 表达式,如下所示

public BiFunction<String, Class<T>, T> getCollection = (collectionName, typeParameterClass) -> {
    return mongoClient
            .getDatabase(mongodbConfiguration.getDatabase())
            .getCollection(collectionName, typeParameterClass);
};

从上面的代码我有一个类型错误TtypeParameterClass

在此处输入图像描述

更新 1

在实现@Clashsoft 建议的方法时,第二个参数Class<Object>Class<T>

repository.getCollectionFactory().apply("", Category.class);

在此处输入图像描述

标签: javagenericsjava-8

解决方案


这在字段中是不可能的。但是,您可以使用类型参数创建另一个方法/getter:

public <T> BiFunction<String, Class<T>, MongoCollection<T>> getCollectionFactory() {
    return  (collectionName, typeParameterClass) -> {
        return mongoClient
                .getDatabase(mongodbConfiguration.getDatabase())
                .getCollection(collectionName, typeParameterClass);
    };
};

请记住,您必须在调用方法时指定类型:

repository.<Category>.getCollectionFactory().apply("test", Category.class)

或者使用具有显式类型的变量:

BiFunction<String, Class<Category>, MongoCollection<Category>> factory = repository.getCollectionFactory();
factory.apply("test", Category.class)

当然,您已经可以使用常规的旧getCollection方法执行此操作:

BiFunction<String, Class<Category>, MongoCollection<Category>> factory = repository::getCollection;

所以工厂方法的用处是值得怀疑的。


推荐阅读