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

目录
相关文章
|
2天前
|
人工智能 Java
Java 中数组Array和列表List的转换
本文介绍了数组与列表之间的相互转换方法,主要包括三部分:1)使用`Collections.addAll()`方法将数组转为列表,适用于引用类型,效率较高;2)通过`new ArrayList&lt;&gt;()`构造器结合`Arrays.asList()`实现类似功能;3)利用JDK8的`Stream`流式计算,支持基本数据类型数组的转换。此外,还详细讲解了列表转数组的方法,如借助`Stream`实现不同类型数组间的转换,并附带代码示例与执行结果,帮助读者深入理解两种数据结构的互转技巧。
Java 中数组Array和列表List的转换
|
3月前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
2943 2
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
3月前
|
JSON 前端开发 JavaScript
Java属性为什么不能是is开头的boolean
在Java实体类中,阿里规约要求boolean属性不应以is开头。文章通过实际案例分析了isUpdate字段在JSON序列化过程中变为update的问题,并提供了自定义get方法或使用@JSONField注解两种解决方案,建议遵循规约避免此类问题。
114 0
Java属性为什么不能是is开头的boolean
|
4月前
|
存储 Java API
Java交换map的key和value值
通过本文介绍的几种方法,可以在Java中实现Map键值对的交换。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。对于简单的键值对交换,可以使用简单遍历法或Java 8的Stream API;对于需要处理值不唯一的情况,可以使用集合存储或Guava的Multimap。希望本文对您理解和实现Java中的Map键值对交换有所帮助。
86 1
|
5月前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
122 5
|
5月前
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
119 3
|
5月前
|
Java 程序员
Java|List.subList 踩坑小记
不应该仅凭印象和猜测,就开始使用一个方法,至少花一分钟认真读完它的官方注释文档。
69 1
|
4月前
|
NoSQL Java Redis
List集合按照由小到大排序或者由大到小排序
List集合按照由小到大排序或者由大到小排序
77 0
《21天学通Java(第6版)》—— 1.4 属性和行为
这两者在VolcanoRobot中都有,这是今天将作为类实现的项目。该项目使用计算机模拟火山探测工具,它模仿的是NASA的“遥控机器人研究”计划中用来在火山裂缝中进行研究探测的Dante II机器人。
1896 0
|
存储 机器人 Java
《21天学通Java(第7版)》—— 1.4 属性和行为
Java类包含两种不同的信息:属性和行为。 这两者在MarsRobot中都有,这是今天将作为类实现的项目。该项目使用计算机模拟行星探测工具,灵感来自NASA喷气推进实验室(Jet Propulsion Laboratory)用来探测火星表面地质情况的火星探测车(Mars Exploration Rovers)。
1760 0