List根据实体类中某一字段进行去重
1、使用 toMap
收集器
利用 Collectors.toMap
收集器将流中的元素映射为一个 Map,其中键为 OmsOrderId
,值为元素本身。如果存在相同的键(即相同的 OmsOrderId
),则使用 (existing, replacement) -> existing
函数来决定保留哪一个元素。最后,通过调用 values()
方法,获取 Map 中的值集合,即去重后的元素集合。
- 利用了
Collectors.toMap
收集器,将元素映射到它们的OmsOrderId
,然后通过values()
方法获取去重后的值。 - 适用于你希望保留重复元素中的第一个元素的情况,它使用了
existing -> existing
的合并函数来解决重复键的问题。
// 从 orderCompanyList 创建一个流,并进行以下操作:
List<StorageDeliveryPrintExcelResp> uniqueOrders = new ArrayList<>(orderCompanyList.stream()// 使用 Collectors.toMap 收集器将流中的元素映射为 Map,其中键为 OmsOrderId,值为元素本身。.collect(Collectors.toMap(StorageDeliveryPrintExcelResp::getOmsOrderId, // 使用 StorageDeliveryPrintExcelResp 对象的 getOmsOrderId 方法作为键Function.identity(), // 使用 Function.identity() 作为值,表示保留元素本身(existing, replacement) -> existing // 如果存在重复的键,则使用现有的元素替换重复元素,即保留第一个出现的元素))// 获取 Map 中的值集合,即去重后的元素集合.values());
2、使用 collectingAndThen
收集器和 TreeSet
:
- 将流中的元素收集到一个
TreeSet
中,该TreeSet
按照OmsOrderId
属性进行比较和排序,同时去除重复元素。 - 使用
Collectors.collectingAndThen
收集器对TreeSet
进行后续处理,将其转换为一个新的ArrayList
// 从 orderCompanyList 创建一个流,并进行以下操作:
List<StorageDeliveryPrintExcelResp> uniqueOrders2 = orderCompanyList.stream().collect(// 使用 Collectors.collectingAndThen 收集器,将流中的元素收集为一个列表Collectors.collectingAndThen(// 使用 Collectors.toCollection 收集器,将元素收集到一个 TreeSet 中Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(StorageDeliveryPrintExcelResp::getOmsOrderId))),// 使用 ArrayList::new 将 TreeSet 转换为 ArrayListArrayList::new)
);