前言:在日常开发中,我们需要从一个 List 集合中找出其中某一个对象,下面就介绍如何从 List 集合中找出属性名为 key 属性值为 value 的对象
1、方法 getObjectByKeyAndValue
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 的对象
如您在阅读中发现不足,欢迎留言!!!