前言:在日常开发中,我们需要从一个 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 的对象