Java上的所有对象的Java执行方法

时间:2016-04-20 19:23:32

标签: java

我有这样的界面:

public interface Listener {
    void onA();
    void onB();
    void onC();
}

还有一个监听器/观察者列表:

List<Listener> listeners = new ArrayList<Listener>();

如何轻松通知所有听众,A,B,C是通过Listener.onA()Listener.onB()Listener.onC()发生的?

我是否必须至少三次在所有侦听器上复制粘贴迭代?

在C ++中我会创建这样一个函数:

void Notify(const std::function<void(Listener *listener)> &command) {
  for(auto &listener : listeners) {
    command(listener);
  }
}

并为每个方法传递lambda:

Notify([](Listener *listener) {listener->onA();});

Notify([](Listener *listener) {listener->onB();});

Notify([](Listener *listener) {listener->onC();});

Java中是否有类似的方法?

2 个答案:

答案 0 :(得分:6)

在Java 8中,有:

listeners.forEach(listener -> listener.onA());

或:

listeners.forEach(Listener::onA);

请注意,还有许多其他功能编程风格的操作可以使用lambda函数执行,但是大多数操作都要求您首先从集合中创建 stream 在其上调用.stream()。我从评论中了解到,forEach()是一个例外。

答案 1 :(得分:1)

如果您的Java版本不允许使用Lambdas,请执行以下操作:

List<Listener> l = ...
for (Listener myListeners : listenersList) {
    myListeners.onA();
    myListeners.onB();
    myListeners.onC();
}