java - 泛型方法作为使用 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);
};
从上面的代码我有一个类型错误T
和typeParameterClass
更新 1
在实现@Clashsoft 建议的方法时,第二个参数Class<Object>
是Class<T>
repository.getCollectionFactory().apply("", Category.class);
解决方案
这在字段中是不可能的。但是,您可以使用类型参数创建另一个方法/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;
所以工厂方法的用处是值得怀疑的。
推荐阅读
- swift - 如何为 KCFloatingActionButton 定义 touchUpInside 动作?
- c - 用 fork 创建 num 个进程,然后删除一些我不会使用的进程
- python - 有一个错误需要解密一个整数
- javascript - 使用 Reactjs 的点表示法与括号表示法
- r - 查找值为零的行并在其前后添加行数
- javascript - Firebase onDisconnect().set() 功能
- ios - 从 CGPoints 数组中获取最大值和最小值
- web-deployment - 雨果:不要发布以后的帖子
- node.js - 自动初始化 node.js 应用程序中的数据
- java - 工厂设计的实现,在 Spring Boot 中遇到了这个错误