如何将函数式接口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
相关产品推荐
相关产品推荐

