使用java.util.Function作为函数编程的通用方法
我不确定我们是否可以使用Java8LAMDA表达式将泛型方法编写为函数编程,如下所示使用java.util.Function作为函数编程的通用方法,java,generics,java-8,Java,Generics,Java 8,我不确定我们是否可以使用Java8LAMDA表达式将泛型方法编写为函数编程,如下所示 public BiFunction<String, Class<T>, T> getCollection = (collectionName, typeParameterClass) -> { return mongoClient .getDatabase(mongodbConfiguration.getDatabase())
public BiFunction<String, Class<T>, T> getCollection = (collectionName, typeParameterClass) -> {
return mongoClient
.getDatabase(mongodbConfiguration.getDatabase())
.getCollection(collectionName, typeParameterClass);
};
通用方法
public <T> MongoCollection<T> getCollection(String collectionName, Class<T> typeParameterClass) {
return mongoClient
.getDatabase(mongodbConfiguration.getDatabase())
.getCollection(collectionName, typeParameterClass);
}
这在字段中是不可能的。但是,您可以使用类型参数创建另一个方法/getter: 公共双功能getCollectionFactory(){ 返回(collectionName,typeParameterClass)->{ 返回mongoClient .getDatabase(mongodbConfiguration.getDatabase()) .getCollection(collectionName,typeParameterClass); }; }; 请记住,调用方法时必须指定类型:
repository..getCollectionFactory().apply(“测试”,Category.class)
或者使用显式类型的变量:
BiFunction factory=repository.getCollectionFactory();
工厂应用(“测试”,类别,类别)
当然,您已经可以使用常规的oldgetCollection
方法执行此操作:
BiFunction factory=repository::getCollection;
因此,工厂方法的有用性是值得怀疑的。双功能错误的第三种类型(结果类型)应该是
MongoCollection
:
。。。否则,您需要定义一个泛型类型的方法,返回这样的函数接口实现:
public <T> BiFunction<String, Class<T>, MongoCollection<T>> getCollectionBiFunction() {
return (name, type) ->
mongoClient
.getDatabase(mongodbConfiguration.getDatabase())
.getCollection(name, type);
}
public双函数getCollectionBiFunction(){
返回(名称、类型)->
蒙哥克利特
.getDatabase(mongodbConfiguration.getDatabase())
.getCollection(名称、类型);
}
我认为应该是BiFunction
因为函数返回MongoCollection
@khelwood谢谢,我从问题中复制了这一部分。修正@Clashsoft在实现此方法repository.getCollectionFactory().apply(“test”,Category.class));第二个参数是Class,但它应该是ClassClass@SanJaisy是的,这是一个问题,这种方法会带来很多问题。您需要在getCollectionFactory
调用中指定类型参数:repository..getCollectionFactory().apply(“test”,Category.class)
。这就是为什么我会尝试使用常规方法。如果类是泛型的,则字段可能是否?您的签名至少应该是BiFunction
(尽管我认为这也不起作用),因为返回类型是MongoCollection
,而不是t
。这不起作用,t的类型是什么?请参见编辑。
public BiFunction<String, Class<T>, MongoCollection<T>> getCollection = (name, type) ->
mongoClient
.getDatabase(mongodbConfiguration.getDatabase())
.getCollection(name, type);
public class ClassHavingGetCollectionField<T> {
...
}
public <T> BiFunction<String, Class<T>, MongoCollection<T>> getCollectionBiFunction() {
return (name, type) ->
mongoClient
.getDatabase(mongodbConfiguration.getDatabase())
.getCollection(name, type);
}