使用 lambdas/方法引用的 java 8 事件监听器/调度程序 - 如何实现某些事情?

标签 java lambda java-8

我正在尝试使用新添加的 lambda 在 Java 中编写事件引擎。如果以下代码能够工作,我非常希望:

public class Test
{
    public Test()
    {
        EventEngine.listen(EventType.THIS, self::thisEventCallback);
        EventEngine.listen(EventType.THAT, self::thatEventCallback);
        EventEngine.listen(EventType.OTHER, (other) -> other.doX());
    }

    private void thisEventCallback()
    {
        // do whatever here
    }

    private boolean thatEventCallback(SomeObject parameter)
    {
        return parameter.someCheckOrWhatever();
    }
}

据我了解,我必须定义一个通用的空接口(interface),例如,public interface Listener {//此处什么都没有},并通过每种事件类型的各种其他接口(interface)扩展它所以我可以在需要时指定不同的参数和返回类型。 显然,这需要将回调转换为 EventEngine 的触发方法内的特定接口(interface),但我对此没有问题。

但是,在此之前,我需要了解如何引用我为 EventDispatcher.listen 方法定义的这些私有(private)方法。 self::thisEventCallback 不起作用。在 Java 8 中是否有办法做到这一点,还是只能在 Scala 中实现?

如果没有,那么您建议使用什么替代方案,而不需要为每个监听器/回调创建一个新对象?

最佳答案

    EventEngine.listen(EventType.THIS, this::thisEventCallback);
    EventEngine.listen(EventType.THAT, this::thatEventCallback);
    EventEngine.listen(EventType.OTHER, (other) -> other.doX());

所以this而不是self

并且您需要具有与回调具有相同签名的一个抽象方法的功能接口(interface)。

public interface THISInterface {
    public void thisEventCallback();
}

public interface THATInterface {
    public boolean thatEventCallback(SomeObject parameter)
}

class EventEngine {
    public void listen(Type t, THISInterfcace thisCallback) {
        thisCallback.thisEventCallback();
    }
    public void listen(Type t, THATInterfcace thatCallback) {
        boolean ok = thatCallback.thatEventCallback();
    }
    ...
}

但是已经有很多 functional interfaces预定义的,您应该需要学习。例如,在这里,人们不需要自己的接口(interface)。

class EventEngine {
    public void listen(Type t, Consumer<Void> thisCallback) {
        thisCallback.accept();
    }
    public void listen(Type t, Predicate<Void> thatCallback) {
        boolean ok = thatCallback.test();
    }

以上是否正确,我不确定(目前深陷java 6 - 叹息)。

关于使用 lambdas/方法引用的 java 8 事件监听器/调度程序 - 如何实现某些事情?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24285861/

相关文章:

c# - Lambda 表达式 `x => x.Property` 更改为 `x => Convert(x.Property)`

c++ - Lambda 捕获和具有相同名称的参数 - 谁会影响另一个? (clang vs gcc)

java - 如何使用箭头符号(->)创建 protected 方法?

java - do...while() 使用 Java 8 流?

Java修改Python中的UTF-8字符串

java - Bootstrap jar 定位../lib/rt.jar 和 ../lib/ext.**jar 如何以及何时加载?

java - 添加到 eclipse 项目的外部 jar

java - 手动 Swing 数据绑定(bind)

java - 简化 Java 流中的 Lambda 表达式

java - 二元运算符的错误操作数类型 '%'