You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:14:25