我有这样的界面:
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中是否有类似的方法?
答案 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();
}