
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;
}
1234567891011121314151617181920212223242526272829303132333435363738394041424344
- 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"));
}
12345678
我们在 List 集合中传入了两个对象,然后我们需要找出 name 为 jack 的对象
打印结果
这样,我们就找出了 name 为 jack 的对象
如您在阅读中发现不足,欢迎留言!!!