Java 通量映射中的重载?

Java 通量映射中的重载?,java,overloading,spring-data-mongodb,project-reactor,Java,Overloading,Spring Data Mongodb,Project Reactor,我想使用springReactiveMongoRepository从mongoDB流式处理多个事件,所有事件都继承自同一基本类型。接下来,我想对它们进行不同的处理,从而定义一个handle方法的几个重载,所有重载都用于一个子级。然而,编译器抱怨说,他找不到合适的方法 该测试方法举例说明了该问题: @Test public void polymorphismTest() { this.createFlux() .map(this::polymorphicMethod

我想使用spring
ReactiveMongoRepository
从mongoDB流式处理多个事件,所有事件都继承自同一基本类型。接下来,我想对它们进行不同的处理,从而定义一个handle方法的几个重载,所有重载都用于一个子级。然而,编译器抱怨说,他找不到合适的方法

该测试方法举例说明了该问题:

@Test
public void polymorphismTest() {
    this.createFlux()
            .map(this::polymorphicMethod)
            .subscribe();
}

private Flux<A> createFlux() {
    A1 a1 = new A1();
    a1.string1 = "foo";
    A2 a2 = new A2();
    a2.string2 = "bar";
    return Flux.just(a1, a2);
}

private void polymorphicMethod(A1 a1) {
    System.out.println(a1.string1);
}

private void polymorphicMethod(A2 a2) {
    System.out.println(a2.string2);
}
@测试
公共void多态性测试(){
这是createFlux()
.map(此::多态方法)
.subscribe();
}
私有流量createFlux(){
A1=新的A1();
a1.1=“foo”;
A2=新的A2();
a2.2=“钢筋”;
返回通量.just(a1,a2);
}
私有void多态方法(A1){
System.out.println(a1.string1);
}
私有void多态方法(A2){
System.out.println(a2.string2);
}
我在某种程度上理解了这个问题,因为编译器无法知道我有一个适合所有继承类的方法。不过,如果有一个类似于我的方法的解决方案就好了,因为它(在我看来)干净易读

我知道,解决方案是在基类型中将句柄定义为抽象方法,并在继承的类中实现它,但这会破坏应用程序其余部分的功能方法,而且数据库中的事件应该是POJO


我还希望避免使用典型的命令模式方法,将类型映射到函数,但如果没有其他想法,这可能是解决方案。

您可以利用Spring提供类型,帮助Reactor将适当的“事件”排序到适当的“事件处理程序”

例如,您可以定义以下内容:

公共接口事件监听器{
默认类getType(){
返回(类)GenericTypeResolver.resolveTypeArgument(getClass(),EventListener.Class);
}
单执行(E事件);
}
您现在可以执行以下操作:

EventListener<E> listener = ...
sourceFlux.ofType(listener.getType()).flatMap(listener::execute)
EventListener=。。。
sourceFlux.ofType(listener.getType()).flatMap(listener::execute)
使用Spring,您可以定义多个
EventListener
实例(通过创建继承它的类并使用
@Component
或使用该接口的多个
@Bean
实例定义
@Configuration
),您可以通过
@Autowire
@Bean
收集这些实例进行“注册”对于这些事件


这避免了需要定义巨大的映射,并且包含的代码与处理每种事件类型的代码一样多。

首先感谢您的回答。我不确定我是否最终得到了它,但似乎type()的
函数正在按类型过滤
流量。这不是我需要的。我有几个事件与相同的父事件需要顺序处理。我不认为有任何神奇的解决方案仅仅基于多态性,特别是如果你想在相同的原始序列中处理元素。这是命令模式!