使用java.util.Function作为函数编程的通用方法

使用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())

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

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();
工厂应用(“测试”,类别,类别)
当然,您已经可以使用常规的old
getCollection
方法执行此操作:

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);
}