【转】List 根据实体属性搜索

原帖地址:https://ld246.com/article/1575555938416

如果是String等基础类型的List,直接用List.contains。

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

728 x 537 1546 x 1140


如上图所示,可以把两个实体给查找出来。

 

DEMO 总评

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



作者:xiaodaojava
链接:https://ld246.com/article/1575555938416
来源:链滴
协议:CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0/

posted @ 2020-10-13 20:23  伊贺双刀流  阅读(473)  评论(0)    收藏  举报