无需等待List完全填充,如何即时访问列表新增的元素?
你原代码存在两处语法问题:
- 方法内部局部变量不能用
private修饰,计数器theCount需要定义为类成员变量,否则每次调用方法都会被重置为0 - 方法返回值声明为
void但内部有返回值,需要修改为对应返回类型比如String
针对你的需求,以下是两种主流可直接落地的实现方案:
方案1:自定义带监听能力的ObservableList,改造getListMethod返回值
核心思路是给原有的List做一层装饰,重写所有元素添加的方法,当有元素新增时触发预先注册的监听器回调,你可以在回调里直接处理新增的元素,不需要轮询查询。
- 先定义监听器接口和可观测List实现
// 定义元素新增监听器接口 @FunctionalInterface interface ListAddListener<T> { void onElementAdded(T newElement); }
import java.util.ArrayList; import java.util.Collection; import java.util.List; public class ObservableList<T> extends ArrayList<T> { private final List<ListAddListener<T>> listeners = new ArrayList<>(); // 注册监听器 public void addAddListener(ListAddListener<T> listener) { listeners.add(listener); } // 触发所有监听器回调 private void notifyAdded(T newElement) { for (ListAddListener<T> listener : listeners) { listener.onElementAdded(newElement); } } // 重写所有元素添加相关方法,插入回调逻辑 @Override public boolean add(T t) { boolean result = super.add(t); notifyAdded(t); return result; } @Override public void add(int index, T element) { super.add(index, element); notifyAdded(element); } @Override public boolean addAll(Collection<? extends T> c) { boolean result = super.addAll(c); for (T t : c) { notifyAdded(t); } return result; } @Override public boolean addAll(int index, Collection<? extends T> c) { boolean result = super.addAll(index, c); for (T t : c) { notifyAdded(t); } return result; } }
- 业务代码改造示例
// 计数器提为类成员变量 private int theCount = 0; // 改造getListMethod返回ObservableList private ObservableList<String> getListMethod(String str) { ObservableList<String> list = new ObservableList<>(); // 原有业务逻辑保持不变 return list; } private String someMethod () { String str= "someStrParam"; ObservableList<String> itemList = getListMethod(str); // 注册元素新增监听器,元素新增时立刻触发 itemList.addAddListener(newElement -> { // 这里直接拿到新增的元素,不需要主动查询 // 可直接写你的业务处理逻辑 System.out.println("收到新增元素:" + newElement); }); if (theCount < itemList.size()) { return itemList.get(theCount++); } else { return null; } }
方案2:使用阻塞队列实现主动等待获取
如果你是希望调用someMethod的时候如果没有元素就等待,有新增元素立刻返回,那可以把getListMethod的返回值改成BlockingQueue,直接用它的take()方法实现阻塞等待,有元素新增立刻返回,不需要额外实现监听器:
import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; private BlockingQueue<String> getListMethod(String str) { // 按需选择ArrayBlockingQueue/LinkedBlockingQueue即可 return new LinkedBlockingQueue<>(); } private String someMethod() throws InterruptedException { String str= "someStrParam"; BlockingQueue<String> itemQueue = getListMethod(str); // 有元素新增时立刻返回,没有就阻塞等待,不需要轮询 return itemQueue.take(); }
内容的提问来源于stack exchange,提问作者Ajay Kumar
相关产品推荐
相关产品推荐

