我有一个包含字符串的列表和另一个包含 Java 自定义对象的列表。
Java 自定义对象:
public class DeviceKeyDto {
private String deviceId;
private String deviceKey;
}
我在两个列表中总共有 5000 多条记录。
一个列表,
List<String> devices
,另一个列表,List<DeviceKeyDto> deviceKeyDtoList
。
我必须根据第二个列表deviceIds过滤第一个列表,代码写在下面,使用带
anymatch
的流。
List<String> nonMatchedDevices = devices.stream.filter(deviceId ->
!deviceKeyDtoList.stream().anyMatch(deviceKeyDto ->
deviceKeyDto.getDeviceId().equalsIgnoreCase(deviceId))
.collect(Collectors.toList());
我在两个列表中都有大量数据,超过 5000 项,所以我想检查性能影响。如果对性能有影响,那么替代解决方案是什么?
提升
HashSet
提供持续查找的优势。
final List<String> devices = ...
final List<DeviceKeyDto> deviceKeyDtoList = ...
// Preferably use a HashSet INSTEAD of the List beforehand.
final Set<String> distinctDevices = new HashSet<>(devices);
final List<DeviceKeyDto> nonMatchedDevices = deviceKeyDtoList.stream()
.filter(device -> !distinctDevices.contains(device.getDeviceId()))
.toList();
一些注意事项:
HashSet
和 HashMap
)。这应该是您尝试的第一件事。只有当它不够并且缺乏性能时,才搜索高级选项,但这确实不太可能。对于这样的基本实现来说,哈希结构应该绰绰有余。List<devices>
,devices.stream. filter
,括号...