【代碼碎片】【Java】用泛型實現抽取List 中的某個E項目,返回一個新的List


最近項目中有個需求,需要從一個List中,抽取其中一個項目,生成一個新的List。因為這個操作需要對不同類型的List使用,並且抽取的項目類型也不相同。所以用泛型實現了一個比較通用的方法。下面是實現代碼。

 1 //從一個List<T>中,抽出T中指定項目(E類型),返回一個List<E>
 2 //srtList 抽出源List
 3 //tClass 源List中Item的類型(T自定義類)
 4 //eClass 源List中Item類中要抽出項目的類型E(Stringd等等)
 5 //fieldName 要抽出的項目名(注意,工具里面會利用這個fieldName生成對應的get方法,所以,該類中必須有對應的Get方法)
 6 public static <T, E> List<E> extractItemFromList(List<T> srtList, Class<T> tClass, Class<E> eClass, String fieldName) {
 7     List<E> rtnList = new ArrayList<E>();
 8     Method method = null;
 9     //獲得方法名 getXXX
10     String methodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
11 
12     try {
13         //通過給定的類名,生成類的實例,然后取得這個實例的指定方法名的引用。
14         method = (tClass.newInstance()).getClass().getMethod(methodName);
15     } catch (NoSuchMethodException e) {
16         e.printStackTrace();
17     } catch (InstantiationException e) {
18         e.printStackTrace();
19     } catch (IllegalAccessException e) {
20         e.printStackTrace();
21     }
22 
23     for (T t : srtList) {
24         E obj = null;
25         try {
26             //執行對象t的特定方法(前面取得的方法名method)
27             obj = (E) method.invoke(t);
28             rtnList.add(obj);
29         } catch (IllegalAccessException e) {
30             e.printStackTrace();
31         } catch (InvocationTargetException e) {
32             e.printStackTrace();
33         }
34     }
35     return rtnList;
36 }

method = (tClass.newInstance()).getClass().getMethod(methodName);

有一點需要注意取得方法名的時候,需要先生成T的一個實例,tClass.newInstance(),然后獲得這個實例的類,再獲得指定的方法的引用。

如果不實例化,直接tClass.getMethod的話,得不到實際的方法。如果使用tClass.getMethods的話,會得到Object類的對應方法。

 用法:

List<UserInfo> srcList;(這是源List,里面存放UserInfo,UserInfo里面有name和其他的項目)

List<String> targetList = ListUtil.getItemListFromList(srcList, UserInfo.class, String.class,"name");


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM