根据某一属性条件快速筛选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);
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。