Java ArrayList字符串过滤:如何过滤含两个DataItem对象的列表
嘿,我来帮你搞定这个ArrayList的字符串过滤需求!咱们先理清楚前提——我默认你是在Java环境下操作,而且你的DataItem类已经有对应的getter方法(比如getRname()、getCategory()、getAddress()这些,毕竟要获取字段值来过滤嘛)。下面给你两种实用的实现方案,还有常见场景的示例:
方案1:传统循环遍历过滤
如果你的项目还在用Java 8之前的版本,或者你更习惯直观的循环写法,这种方式最稳妥。核心思路就是遍历原ArrayList的每个DataItem,判断是否符合字符串过滤条件,符合的就加入新的列表。
示例代码(比如过滤名称包含"Pizza"的项):
import java.util.ArrayList; import java.util.List; public class DataItemFilter { public static void main(String[] args) { // 假设这是你的原ArrayList ArrayList<DataItem> originalList = new ArrayList<>(); originalList.add(new DataItem("324e9c2b-2db0-407b-9ec8-66b707b2047f", "2", "Domino's Pizza", "sf_photo", "1", "flipstreet", "fast-food", "Taif Street, Dhahrat Laban, Riyadh 12564")); originalList.add(new DataItem("e8b0e814-f9e0-4eb8-ae2f-b118f6b4e55d", "6", "KFC", "sf_photo", "2", "downtown", "fast-food", "King Fahd Road, Riyadh 12345")); // 过滤后的列表 ArrayList<DataItem> filteredList = new ArrayList<>(); String keyword = "Pizza"; for (DataItem item : originalList) { // 判断名称是否包含目标关键词(可根据需求改成其他字段) if (item.getRname().contains(keyword)) { filteredList.add(item); } } // 输出结果 for (DataItem item : filteredList) { System.out.println(item.getRname()); // 会输出 Domino's Pizza } } } // 假设你的DataItem类定义如下 class DataItem { private String itemId; private String sortPosition; private String rname; private String latLat; private String lomgLong; private String neighborhood; private String category; private String address; // 构造方法 public DataItem(String itemId, String sortPosition, String rname, String latLat, String lomgLong, String neighborhood, String category, String address) { this.itemId = itemId; this.sortPosition = sortPosition; this.rname = rname; this.latLat = latLat; this.lomgLong = lomgLong; this.neighborhood = neighborhood; this.category = category; this.address = address; } // 对应的getter方法 public String getRname() { return rname; } public String getCategory() { return category; } public String getAddress() { return address; } // 其他字段的getter按需添加 }
方案2:使用Stream API(Java 8+)
Java 8及以上版本的Stream API能让过滤代码更简洁优雅,一行代码就能搞定过滤+收集,可读性也很强。
示例1:精确匹配类别
比如过滤所有类别为fast-food的项:
import java.util.stream.Collectors; // ... List<DataItem> filteredList = originalList.stream() .filter(item -> "fast-food".equals(item.getCategory())) .collect(Collectors.toCollection(ArrayList::new));
示例2:模糊匹配地址(忽略大小写)
如果要过滤地址包含"Riyadh"的项,并且不想区分大小写:
import java.util.stream.Collectors; // ... String cityKeyword = "riyadh"; List<DataItem> filteredList = originalList.stream() .filter(item -> item.getAddress().toLowerCase().contains(cityKeyword.toLowerCase())) .collect(Collectors.toCollection(ArrayList::new));
示例3:多条件组合过滤
比如同时满足“类别是fast-food”且“名称包含Pizza”:
import java.util.stream.Collectors; // ... List<DataItem> filteredList = originalList.stream() .filter(item -> "fast-food".equals(item.getCategory()) && item.getRname().contains("Pizza")) .collect(Collectors.toCollection(ArrayList::new));
进阶:抽离过滤逻辑复用
如果你的过滤条件比较复杂,或者需要在多个地方复用,可以把过滤逻辑抽成一个Predicate对象:
import java.util.function.Predicate; import java.util.stream.Collectors; // ... // 定义一个通用的名称模糊匹配Predicate Predicate<DataItem> nameContainsKeyword(String keyword) { return item -> item.getRname().toLowerCase().contains(keyword.toLowerCase()); } // 使用的时候直接调用 List<DataItem> filteredList = originalList.stream() .filter(nameContainsKeyword("pizza")) .collect(Collectors.toCollection(ArrayList::new));
这样不管是过滤名称、地址还是其他字段,都可以用类似的方式抽离逻辑,代码更整洁。
内容的提问来源于stack exchange,提问作者Rakan Habab
相关产品推荐
相关产品推荐

