java8如何根據某一屬性條件快速篩選list中的集合
根據某一屬性條件快速篩選list中的集合
1、創建個Student對象
public class Student { private String name;//姓名 private Integer age;//年齡 private int sex;//性別 private String professional;//專業 public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } public String getProfessional() { return professional; } public void setProfessional(String professional) { this.professional = professional; } public Student(String name, Integer age, int sex, String professional) { super(); this.name = name; this.age = age; this.sex = sex; this.professional = professional; }
2、編寫測試類
import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class StreamTest { public static void main(String[] args) { List<Student> allList = new ArrayList<Student>(); Student st1 = new Student("小王",26,1,"計算機"); allList.add(st1); Student st2 = new Student("小張",21,1,"電氣"); allList.add(st2); Student st3 = new Student("小紅",22,1,"人文"); allList.add(st3); Student st4 = new Student("小李",23,1,"計算機"); allList.add(st4); System.out.println("**************************目的:隻取專業為計算機行業的集合*************************"); // allList = allList.stream().filter(Student -> Student.getProfessional().equals("計算機")).collect(Collectors.toList()); // allList.forEach(Student -> { // System.out.println(Student.getName()); // }); System.out.println("**************************目的:取專業為計算機和人文專業的集合*************************"); List<String> str=new ArrayList<>(); str.add("計算機"); str.add("人文"); allList = allList.stream().filter(Student -> str.contains(Student.getProfessional())).collect(Collectors.toList()); allList.forEach(Student -> { System.out.println(Student.getName()); }); }
結果如下圖所示:
perfect ! 是不是比for循環遍歷取集合好用的多呢~ give a like?
list 根據實體屬性搜索
工具類如下所示,主要使用瞭泛型,反射
入參:
list,待查找的 list
field
: 要根據 list 中的哪個屬性來查找 ,如上面的 TestModel 中的 name/value
value
: 要查找的值為什麼,如"demo", 查找 list 中 name = demo 的那個數據
clazz
: 泛型類的描述信息,也就是 TestModel
代碼
public static <T> List<T> containsByField(List<T> list ,String field,Object value,Class<T> clazz){ List<T> res = new ArrayList<>(); try { // 通過反射獲取對應的屬性 Field dbField = clazz.getDeclaredField(field); // 設置屬性為可訪問 dbField.setAccessible(true); for (T t : list) { // 遍歷list,獲取到對應屬性的值 Object o = dbField.get(t); if(value.equals(o)){ // 如值和預期想等的話,則加入到返回值中 res.add(t); } } } catch (NoSuchFieldException e) { // 如果不存在這個字段,則直接返回空 return res; } catch (IllegalAccessException e) { e.printStackTrace(); } return res; }
測試
List<TestModel> c = containsByField(list, "name", "demo", TestModel.class);
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 關於List、Map、Stream初始化方式
- Java8 實現stream將對象集合list中抽取屬性集合轉化為map或list
- 關於JAVA8的 Stream學習
- Java List的sort()方法改寫compare()實現升序,降序,倒序的案例
- Java實現List去重的方法詳解