Java - 找出 List 集合中属性名为 key 属性值为 value 的对象

简介: Java - 找出 List 集合中属性名为 key 属性值为 value 的对象

在日常开发中,我们需要从一个 List 集合中找出其中某一个对象,下面就介绍如何从 List 集合中找出属性名为 key 属性值为 value 的对象。

方法 getObjectByKeyAndValue

/**
 * 在一个实体list中,找出属性是key,值为value的实体
 *
 * @param list
 * @param key
 * @param value
 * @param <T>
 * @return
 */
private static <T> T getObjectByKeyAndValue(List<T> list, String key, String value) {
    if (null == list || list.isEmpty() || StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {
        return null;
    }
    for (T item : list) {
        try {
          // 获取当前类
            Class cls = item.getClass();
            // 获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段
            Field[] fields = cls.getDeclaredFields();
            for (int i = 0; i < fields.length; i++) {
                Field f = fields[i];
                // 当未设置Field的setAccessible方法为true时,会在调用的时候进行访问安全检查,会抛出IllegalAccessException异常
                f.setAccessible(true);
                // 获取字段的名称
                String name = f.getName();
                // 如果key相等
                if (key.equals(name)) {
                    // 如果值相等
                    if (f.get(item).equals(value)) {
                        // 返回对应的类,结束循环
                        return item;
                    }
                    // 否则直接结束当前循环
                    else {
                        break;
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return null;
}
  • getClass(),我们通过反射,获取当前类。
  • getDeclaredFields,获取当前类所有声明字段。
  • setAccessible(true),这一步是有必要的,会在调用的时候进行访问安全检查,会抛出IllegalAccessException异常。
  • getName(),获取字段名,跟我们传入的 key 进行比较。
  • 再获取属性值跟我们传入的 value 进行比较。

 

测试

public static void main(String[] args) {
    List<User> list = new ArrayList<>();
    User user = new User(2, "rose", 18);
    User user1 = new User(1, "jack", 20);
    list.add(user);
    list.add(user1);
    System.out.println(getObjectByKeyAndValue(list, "name", "jack"));
}

我们在 List 集合中传入了两个对象,然后我们需要找出 name 为 jack 的对象。

打印结果


image.png

目录
相关文章
|
14天前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
34 3
|
6天前
|
Java
java代码优化:判断内聚到实体对象中和构造上下文对象传递参数
通过两个常见的java后端实例场景探讨代码优化,代码不是优化出来的,而是设计出来的,我们永远不可能有专门的时间去做代码优化,优化和设计在平时
24 15
|
1月前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
45 5
|
2月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
50 4
|
2月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
42 2
|
2月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
7月前
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
1095 1
|
6月前
|
Java API Apache
怎么在在 Java 中对List进行分区
本文介绍了如何将列表拆分为给定大小的子列表。尽管标准Java集合API未直接支持此功能,但Guava和Apache Commons Collections提供了相关API。
|
6月前
|
运维 关系型数据库 Java
PolarDB产品使用问题之使用List或Range分区表时,Java代码是否需要进行改动
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
6月前
|
存储 安全 Java
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法