在项目的代码编写中遇到这样一个问题。需要对关联方传递过来的列表数据进行一个筛选校验; 把已经回调传递过来的数据给去掉。然后把没有回调过来的数据再接着进行处理。
问题大致分析如下:
一个集合A包含多个对象,当然这些对象具有相同的属性,另一个集合B包含对象id属性,将A集合对象中存在与B集合对象相同id对象移除。
方法一: 使用递归实现
/**
* 使用递归方式实现(这个方式消耗性能,不推荐)
* @author lyh
* @version v-1.0.0
* @since 2021/5/20
*/
public class RecurTest {
public static void main(String[] args) {
List<Person> listA = new ArrayList<Person>();
//模拟关联方传递过来的数据列表
listA.add(new Person("001", "zs", 18));
listA.add(new Person("002", "ls", 19));
listA.add(new Person("003", "wu", 20));
listA.add(new Person("004", "zl", 21));
//模拟在数据库中查询到的数据id列表
List<String> listB = new ArrayList<String>();
listB.add("002");
listB.add("004");
//将在数据库中查询存在的数据,根据返回的id列表去移除listA中对应的对象
List<Person> listRes = getListRes(listA, listB);
System.out.println(listRes);
//成功将id为002和004的对象移除:[Person(id=001, name=zs, age=18), Person(id=003, name=wu, age=20)]
}
public static List<Person> getListRes(List<Person> listA, List<String> listB) {
for (Person person : listA) {
if (listB.contains(person.getId())) {
listA.remove(person);
//此处使用了递归
return getListRes(listA,listB);
}
}
return listA;
}
}
方法二: 使用stream流实现
/**
* 使用Stream流方式实现(推荐使用这个方式)
*
* @author lyh
* @version v-1.0.0
* @since 2021/5/20
*/
public class StreamTest {
public static void main(String[] args) {
List<Person> listA = new ArrayList<Person>();
//模拟关联方传递过来的数据列表
listA.add(new Person("001", "zs", 18));
listA.add(new Person("002", "ls", 19));
listA.add(new Person("003", "wu", 20));
listA.add(new Person("004", "zl", 21));
//模拟在数据库中查询到的数据id列表
final List<String> listB = new ArrayList<String>();
listB.add("002");
listB.add("004");
//用stream流来处理
List<Person> listRes = listA.stream()
.filter((Person p) -> listB.contains(p.getId()))
.collect(Collectors.toList());
//将要过滤的对象根据id查出来,再利用集合的removeAll方法
listA.removeAll(listRes);
//查看结果,成功将id为002和004的对象移除:[Person(id=001, name=zs, age=18), Person(id=003, name=wu, age=20)]
System.out.println(listA);
}
}
觉得此文不错的,点赞收藏+转发,本人非常感谢!