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

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

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

1、方法 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 进行比较

2、测试

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 的对象

打印结果

这样,我们就找出了 name 为 jack 的对象

目录
相关文章
|
14天前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
3天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
10 2
|
3天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
8天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
8天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
8天前
|
Java 开发者
|
7天前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
10 0
|
12天前
|
Java API Apache
java集合的组内平均值怎么计算
通过本文的介绍,我们了解了在Java中计算集合的组内平均值的几种方法。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。无论是使用传统的循环方法,还是利用Java 8的Stream API,亦或是使用第三方库(如Apache Commons Collections和Guava),都可以有效地计算集合的组内平均值。希望本文对您理解和实现Java中的集合平均值计算有所帮助。
21 0
|
17天前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
12 0
|
5月前
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
877 1