我不确定是否可以使用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);
};从上面的代码中,我对T和typeParameterClass类型有一个错误

更新1
在实现@Clashsoft建议的方法时,第二个讨论是Class<Object>而不是Class<T>
repository.getCollectionFactory().apply("", Category.class);

发布于 2021-02-19 09:27:09
用一个字段是不可能的。但是,您可以使用类型参数创建另一个方法/ 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;因此,工厂方法的有效性是值得怀疑的。
发布于 2021-02-19 10:39:15
BiFunction错误的第三种类型(结果类型)应该是MongoCollection<T>
public BiFunction<String, Class<T>, MongoCollection<T>> getCollection = (name, type) ->
mongoClient
.getDatabase(mongodbConfiguration.getDatabase())
.getCollection(name, type);还要注意,T必须是类泛型参数,只要getCollection不再是一个方法,而是一个字段。
public class ClassHavingGetCollectionField<T> {
...
}..。否则,您需要定义一个泛型类型返回此类功能接口实现的方法:
public <T> BiFunction<String, Class<T>, MongoCollection<T>> getCollectionBiFunction() {
return (name, type) ->
mongoClient
.getDatabase(mongodbConfiguration.getDatabase())
.getCollection(name, type);
}https://stackoverflow.com/questions/66274803
复制相似问题