java 基础 |List 根据实体属性值搜索

本贴最后更新于 1813 天前,其中的信息可能已经时过境迁

javaDEMO

本网站记录了最全的各种 JavaDEMO ,保证下载,复制就是可用的,包括基础的, 集合的, spring 的, Mybatis 的等等各种,助力你从菜鸟到大牛,记得收藏哦~~
https://www.javastudy.cloud

List 判断包含某个值

我们常常会用 contains 方法去判断一个 list 中是否包含某一串字符/数字,如下代码所示:

List<String> list  = new ArrayList<>();
        list.add("java");
        list.add("study");
        list.add("cloud");
        boolean c = list.contains("java");
        System.out.println(c);

如果也不出意外的输出了 true,如下图所示:
image.png
那如果 List 中不是简单的 String/Integer 等基本类型呢? 如下所示, 这时候要找 list 中是否包含 name="demo" 的实体,要怎么写?

public static void main(String[] args) {
        List<TestModel> list  = new ArrayList<>();
        list.add(new TestModel("java","study"));
        list.add(new TestModel("demo","cloud"));
        list.add(new TestModel("demo","java技术大本营"));
        // 这时候要找list中是否包含 name="demo" 的实体,要怎么写?
        System.out.println();
    }
    
    static class TestModel {
        private String name;
        private String value;

        public TestModel(String name, String value) {
            this.name = name;
            this.value = value;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }

List 根据实体属性搜索

工具类如下所示,主要使用了泛型,反射
入参:
list,待查找的 list
field: 要根据 list 中的哪个属性来查找 ,如上面的 TestModel 中的 name/value
value: 要查找的值为什么,如"demo", 查找 list 中 name = demo 的那个数据
clazz: 泛型类的描述信息,也就是 TestModel

public static <T> List<T> containsByField(List<T> list ,String field,Object value,Class<T> clazz){
        List<T> res = new ArrayList<>();

        try {
	// 通过反射获取对应的属性
            Field dbField = clazz.getDeclaredField(field);
	// 设置属性为可访问
            dbField.setAccessible(true);
            for (T t : list) {
	// 遍历list,获取到对应属性的值
                Object o = dbField.get(t);
                if(value.equals(o)){
		// 如值和预期想等的话,则加入到返回值中
                    res.add(t);
                }
            }
        } catch (NoSuchFieldException e) {
	// 如果不存在这个字段,则直接返回空
            return res;
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return res;
    }

运行测试

 public static void main(String[] args) {
        List<TestModel> list = new ArrayList<>();
        list.add(new TestModel("java", "study"));
        list.add(new TestModel("demo", "cloud"));
        list.add(new TestModel("demo", "java技术大本营"));
        List<TestModel> c = containsByField(list, "name", "demo", TestModel.class);
        System.out.println(c);
    }

输出如下:
image.png
如上图所示,可以把两个实体给查找出来.

DEMO 总评

这是一个小工具,今天工作中刚好用到,就顺手写了一个并整理了下,逻辑不麻烦,主要是反射的知识点,要学好反射,实在是写工具类的一大利器! 加油!

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...