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。

推薦閱讀: