使用anyMatch进行列表迭代的性能[关闭]

问题描述 投票:0回答:1

我有一个包含字符串的列表和另一个包含 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 项,所以我想检查性能影响。如果对性能有影响,那么替代解决方案是什么?

java performance collections java-stream
1个回答
0
投票

提升

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();

一些注意事项:

  1. 在编程世界中,5000 条记录对于这种情况来说根本不算什么。
  2. 将头部查找与哈希结构相关联(
    HashSet
    HashMap
    )。这应该是您尝试的第一件事。只有当它不够并且缺乏性能时,才搜索高级选项,但这确实不太可能。对于这样的基本实现来说,哈希结构应该绰绰有余。
  3. Always发布可编译且格式化的代码。您的代码无法复制粘贴运行:
    List<devices>
    devices.stream. filter
    ,括号...
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.