
本教程旨在探讨如何在java中高效地从一个对象列表中移除那些其特定键值不存在于另一个列表中的元素。文章将详细介绍java 8及更高版本中利用stream api的优化方案,以及java 8之前版本通过循环和迭代器实现相同功能的多种方法,并提供相应的代码示例和性能考量。
在数据处理中,我们经常遇到需要根据一个参考列表来过滤另一个列表的场景。例如,给定两个包含不同类型对象但具有关联键(如编码)的列表:
public class RetailerExcelConversionDto {
private String retailerCode;
private Integer isActive;
// Getters and Setters
public String getRetailerCode() { return retailerCode; }
public void setRetailerCode(String retailerCode) { this.retailerCode = retailerCode; }
public Integer getIsActive() { return isActive; }
public void setIsActive(Integer isActive) { this.isActive = isActive; }
}
public class RetailerDto {
private String code;
private Integer age;
private String name;
// Getters and Setters
public String getCode() { return code; }
public void setCode(String code) { this.code = code; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}假设我们有两个列表实例:
List<RetailerExcelConversionDto> retailerConversionDtoList = getAllRetailerConversionDtoList(); List<RetailerDto> retailerDtoList = getAllRetailer();
我们的目标是从 retailerConversionDtoList 中移除所有 retailerCode 不存在于 retailerDtoList 中任何 code 的元素。简而言之,我们希望保留那些在两个列表中都有对应编码的零售商数据。
在Java 8及更高版本中,Stream API提供了一种简洁且高效的方式来处理这类集合操作。核心思想是首先从参考列表(retailerDtoList)中提取所有关联键到一个 Set 集合中,然后利用 Set 的高效查找特性(平均O(1)时间复杂度)来过滤目标列表(retailerConversionDtoList)。
立即学习“Java免费学习笔记(深入)”;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.ArrayList; // 假设 getAllRetailerConversionDtoList 和 getAllRetailer 返回 ArrayList 或类似的可变列表
// 假设 retailerConversionDtoList 和 retailerDtoList 已经被初始化并填充数据
// 1. 从 retailerDtoList 中提取所有 code 到一个 Set 集合中,用于快速查找
Set<String> retailerCodes = retailerDtoList.stream()
.map(RetailerDto::getCode) // 提取 code 属性
.collect(Collectors.toSet()); // 收集到 Set 中
// 2. 使用 Stream API 过滤 retailerConversionDtoList
retailerConversionDtoList = retailerConversionDtoList.stream()
.filter(dto -> retailerCodes.contains(dto.getRetailerCode())) // 仅保留 retailerCode 存在于 retailerCodes Set 中的元素
.collect(Collectors.toList()); // 收集结果到一个新的 List 中优点:
对于Java 8之前的版本,我们无法使用Stream API。此时,通常需要通过循环和集合操作来完成任务。以下是两种常见的实现方式。
这种方法首先从参考列表中提取所有关联键到一个 HashSet,然后遍历目标列表,将符合条件的元素添加到一个新的列表中。
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
// 假设 retailerConversionDtoList 和 retailerDtoList 已经被初始化并填充数据
Set<String> retailerCodes = new HashSet<>();
for (RetailerDto retailer : retailerDtoList) {
retailerCodes.add(retailer.getCode());
}
List<RetailerExcelConversionDto> newRetailerConversionDtoList = new ArrayList<>();
for (RetailerExcelConversionDto dto : retailerConversionDtoList) {
if (retailerCodes.contains(dto.getRetailerCode())) {
newRetailerConversionDtoList.add(dto);
}
}
// 此时,newRetailerConversionDtoList 包含了过滤后的结果
// 如果需要更新原始列表,可以:retailerConversionDtoList = newRetailerConversionDtoList;优点:
缺点:
如果希望直接修改原始列表而不是创建新列表,可以使用 Iterator 来安全地在循环中移除元素。直接使用增强for循环(for-each)在遍历时调用 list.remove() 会导致 ConcurrentModificationException。
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
// 假设 retailerConversionDtoList 和 retailerDtoList 已经被初始化并填充数据
Set<String> retailerCodes = new HashSet<>();
for (RetailerDto retailer : retailerDtoList) {
retailerCodes.add(retailer.getCode());
}
// 使用迭代器进行遍历和移除
for (Iterator<RetailerExcelConversionDto> it = retailerConversionDtoDtoList.iterator(); it.hasNext(); ) {
RetailerExcelConversionDto next = it.next();
if (!retailerCodes.contains(next.getRetailerCode())) {
it.remove(); // 使用迭代器的 remove 方法安全移除元素
}
}
// 此时,retailerConversionDtoList 已经被原地修改,包含了过滤后的结果优点:
缺点:
从一个列表中移除不存在于另一个列表中的元素是一个常见的编程需求。通过合理利用 HashSet 进行高效查找,并结合Java 8+的Stream API或Java 8之前的循环与迭代器,我们可以高效且优雅地解决这个问题。在实际开发中,应根据项目所使用的Java版本、性能要求以及代码的可读性偏好来选择最合适的实现方案。
以上就是Java中基于关联键值从一个列表中高效移除元素的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号