
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 的對象
如您在閱讀中發現不足,歡迎留言!!!