如何不遍历Java Collection即可获取指定itemId的Item对象
解决方案
方案1:语法层面省略显式循环(底层仍有遍历)
如果不想修改现有的ObservableList存储结构,用Java 8+的Stream API即可实现和你给出的伪代码逻辑相近的写法,无需手动写for循环:
public Item getItem(String itemId) { return items.stream() .filter(item -> itemId.equals(item.getItemId())) .findFirst() .orElse(null); }
如果需要规避空指针风险,也可以返回Optional<Item>类型:
import java.util.Optional; public Optional<Item> getItem(String itemId) { return items.stream() .filter(item -> itemId.equals(item.getItemId())) .findFirst(); }
注意:Stream写法只是语法层面简化了循环代码,底层实现仍然会遍历整个集合,时间复杂度和手写for循环一致,都是O(n)
方案2:真正实现无遍历查询(时间复杂度O(1))
List类的设计本身就不支持按键随机查找,不管是手写循环还是Stream本质都是遍历。要完全避免遍历,需要改用Map结构存储,以itemId作为key,Item对象作为value,查询时时间复杂度为O(1),无任何遍历操作:
如果你需要同时保留FX的ObservableList做UI绑定,可以额外维护一个同步的Map:
import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.collections.ObservableMap; // 同时维护两个存储结构,保证数据同步 ObservableList<Item> items = FXCollections.observableArrayList(); ObservableMap<String, Item> itemIdMap = FXCollections.observableHashMap(); // 新增元素时同步写入两个结构 public void addItem(Item item) { items.add(item); itemIdMap.put(item.getItemId(), item); } // 查询时直接从Map取值,无遍历 public Item getItem(String itemId) { return itemIdMap.get(itemId); }
如果不需要保留原List结构,也可以直接把现有List一次性转成Map使用:
import java.util.stream.Collectors; import java.util.Map; // 转换现有集合为Map Map<String, Item> itemIdMap = items.stream() .collect(Collectors.toMap(Item::getItemId, item -> item)); // 直接查询 public Item getItem(String itemId) { return itemIdMap.get(itemId); }
内容的提问来源于stack exchange,提问作者Michael Sims
相关产品推荐
相关产品推荐

