【发布时间】:2020-08-30 09:22:24
【问题描述】:
功能接口描述如下:
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());
}
}
如何将实现作为参数传递?例如,
private static final Map<EventType, EventReducer> ReducersMap = Map.ofEntries(
entry(EventType.DEATH, MinionDeath::apply);
);
显然,MinionDeath::apply 不是办法
【问题讨论】:
-
您需要实例化
MinionDeath的新实例并将其作为参数传递:entry(EventType.DEATH, new MinionDeath());。 --- 顺便说一句:entry(...)后缺少分号 -
我必须初始化它吗? ::没有办法?
-
如果您将其作为单独的类实现,则不会。您可以做的是将其转换为表达式 lambda:
entry(EventType.DEATH, (event, state) -> ((MinionDeathEvent) event).getPlayer().getBoard().remove(deathEvent.getMinion())); -
如果您喜欢,请创建一个答案
-
您的
EventReducer似乎与BiConsumer非常相似。您是否不想通过interface EventReducer<T> { void apply(T event, GameState state);}后跟new EventReducer<MinionDeathEvent> { @Override public void apply(MinionDeathEvent event, GameState state) { event.getPlayer().getBoard().remove(deathEvent.getMinion()); }之类的东西来引入对类型的认识?
标签: java java-8 functional-interface