You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将函数式接口EventReducer的实现作为参数传递?

问题:如何将函数式接口实现类作为参数传递到映射中?

背景代码

首先你定义了这样的函数式接口:

package models;
@FunctionalInterface
public interface EventReducer {
    void apply(Event event, GameState state);
}

然后实现了该接口的类:

package models.reducers;
import models.Event;
import models.EventReducer;
import models.GameState;
import models.events.MinionDeathEvent;
public class MinionDeath implements EventReducer {
    @Override
    public void apply(Event event, GameState state) {
        MinionDeathEvent deathEvent = (MinionDeathEvent)event;
        deathEvent.getPlayer().getBoard().remove(deathEvent.getMinion());
    }
}

你尝试创建映射时用了MinionDeath::apply,但发现不可行:

private static final Map<EventType, EventReducer> ReducersMap = Map.ofEntries(
    entry(EventType.DEATH, MinionDeath::apply); // 这里报错
);

解决方案

咱们先搞清楚为什么MinionDeath::apply不行:这是实例方法的方法引用,它需要先有一个MinionDeath的实例才能调用apply方法,但你的Map需要的是EventReducer类型的实例,两者类型不匹配,所以编译器肯定不买账。下面是几种正确的做法:

1. 直接创建MinionDeath的实例

最简单直接的方式就是new一个MinionDeath对象,因为它本身就实现了EventReducer接口,完全符合Map的值类型要求:

import java.util.Map;
// 注意要导入Map.entry
private static final Map<EventType, EventReducer> ReducersMap = Map.ofEntries(
    Map.entry(EventType.DEATH, new MinionDeath())
);

2. 用Lambda表达式直接实现(可选)

如果你的MinionDeath类逻辑很简单,也可以不用单独写这个类,直接在Map里用Lambda表达式实现EventReducer接口,代码会更紧凑:

private static final Map<EventType, EventReducer> ReducersMap = Map.ofEntries(
    Map.entry(EventType.DEATH, (event, state) -> {
        MinionDeathEvent deathEvent = (MinionDeathEvent)event;
        deathEvent.getPlayer().getBoard().remove(deathEvent.getMinion());
    })
);

3. 构造方法引用(适合动态创建场景)

如果后续需要动态生成实例(比如配合依赖注入),可以用构造方法引用,但这时候你可能需要调整Map的类型为Map<EventType, Supplier<EventReducer>>,不过如果只是当前场景,直接new实例就足够了。示例如下(仅作扩展参考):

import java.util.function.Supplier;
private static final Map<EventType, Supplier<EventReducer>> ReducersMap = Map.ofEntries(
    Map.entry(EventType.DEATH, MinionDeath::new)
);
// 使用的时候再获取实例:
EventReducer reducer = ReducersMap.get(EventType.DEATH).get();

内容的提问来源于stack exchange,提问作者NeatNerd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 00:22:43