根据一个或多个属性对List去重

Hutool工具类处理

代码说明

  1. CollUtil.distinct方法来源于cn.hutool.core.collection.CollUtil#distinct(java.util.Collection, java.util.function.Function<T,K>, boolean),具体可参考该工具类方法的说明。
  2. StrUtil.format方法来源于cn.hutool.core.text.CharSequenceUtil#format,此方法简单将占位符{}按照顺序替换为参数。

单个字段或多个字段

@Test
public void test02() {
    List<CodeTemplateWriteReqDto> list = new ArrayList<>();
    CodeTemplateWriteReqDto codeTemplateDO01 = new CodeTemplateWriteReqDto();
    codeTemplateDO01.setRemark("备注01");
    codeTemplateDO01.setDelFlag(0);
    list.add(codeTemplateDO01);
    CodeTemplateWriteReqDto codeTemplateDO02 = new CodeTemplateWriteReqDto();
    codeTemplateDO02.setRemark("备注01");
    //codeTemplateDO02.setDelFlag(0);
    codeTemplateDO02.setDelFlag(1);
    list.add(codeTemplateDO02);
    PrintUtil.println(StrUtil.format("去重前list是:{}", JSONUtil.toJsonStr(list)));
    // 按属性去重(单个属性、多个属性都支持)
    list = CollUtil.distinct(list, e -> StrUtil.format("{}_{}", e.getRemark(), e.getDelFlag()), true);
    PrintUtil.println(StrUtil.format("去重后list是:{}", JSONUtil.toJsonStr(list)));
}

Java Stream处理

方法一:自带方法Comparator.comparing(p -> p.get***())

单个字段

@Test
public void test0078() {
    List<CodeTemplateRespDto> list = Lists.newArrayList();
    CodeTemplateRespDto dto1 = new CodeTemplateRespDto();
    dto1.setRemark("备注01");
    dto1.setDelFlag(0);
    list.add(dto1);
    CodeTemplateRespDto dto2 = new CodeTemplateRespDto();
    //dto2.setRemark("备注01");
    dto2.setRemark("备注02");
    dto2.setDelFlag(0);
    list.add(dto2);
    PrintUtil.println(StrUtil.format("去重前list是:{}", JSONUtil.toJsonStr(list)));
    // Collectors.collectingAndThen()是Java 8中的一个辅助方法,它能够将一个Collector收集器转换为另一个收集器,并在最终收集结果上应用一个Function函数。
    list = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(e -> e.getRemark()))), ArrayList::new));
    PrintUtil.println(StrUtil.format("去重后list是:{}", JSONUtil.toJsonStr(list)));
}

多个字段

@Test
public void test0079() {
    List<CodeTemplateRespDto> list = Lists.newArrayList();
    CodeTemplateRespDto dto1 = new CodeTemplateRespDto();
    dto1.setRemark("备注01");
    dto1.setDelFlag(0);
    list.add(dto1);
    CodeTemplateRespDto dto2 = new CodeTemplateRespDto();
    dto2.setRemark("备注01");
    //dto2.setDelFlag(0);
    dto2.setDelFlag(1);
    list.add(dto2);
    PrintUtil.println(StrUtil.format("去重前list是:{}", JSONUtil.toJsonStr(list)));
    // Collectors.collectingAndThen()是Java 8中的一个辅助方法,它能够将一个Collector收集器转换为另一个收集器,并在最终收集结果上应用一个Function函数。
    list = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(p -> p.getDelFlag()+";"+p.getRemark()))), ArrayList::new));
    PrintUtil.println(StrUtil.format("去重后list是:{}", JSONUtil.toJsonStr(list)));
}

方法二:自定义方法Comparator.comparing(p -> p.get***())

工具类

/**
 * 按某个指定字段去重
 *
 * @param keyExtractor - 需要去重的字段
 * @return <T> Predicate<T> - 谓词
 * @author 付聪
 * @date 2023-12-18 13:41
 */
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
    Map<Object, Boolean> seen = new ConcurrentHashMap<>();
    return e -> seen.putIfAbsent(keyExtractor.apply(e), Boolean.TRUE) == null;
}

单个字段

@Test
public void test0080() {
    List<CodeTemplateRespDto> list = Lists.newArrayList();
    CodeTemplateRespDto dto1 = new CodeTemplateRespDto();
    dto1.setRemark("备注01");
    dto1.setDelFlag(0);
    list.add(dto1);
    CodeTemplateRespDto dto2 = new CodeTemplateRespDto();
    //dto2.setRemark("备注01");
    dto2.setRemark("备注02");
    dto2.setDelFlag(0);
    list.add(dto2);
    PrintUtil.println(StrUtil.format("去重前list是:{}", JSONUtil.toJsonStr(list)));
    list = list.stream().filter(StreamUtil.distinctByKey(e -> e.getRemark())).collect(Collectors.toList());
    PrintUtil.println(StrUtil.format("去重后list是:{}", JSONUtil.toJsonStr(list)));
}

多个字段(不支持)

方法三:Stream API

单个字段或多个字段

@Test
public void test0081() {
    List<CodeTemplateRespDto> list = Lists.newArrayList();
    CodeTemplateRespDto dto1 = new CodeTemplateRespDto();
    dto1.setRemark("备注01");
    dto1.setDelFlag(0);
    list.add(dto1);
    CodeTemplateRespDto dto2 = new CodeTemplateRespDto();
    //dto2.setRemark("备注01");
    dto2.setRemark("备注02");
    dto2.setDelFlag(0);
    list.add(dto2);
    PrintUtil.println(StrUtil.format("去重前list是:{}", JSONUtil.toJsonStr(list)));
    Collection<CodeTemplateRespDto> values = list.stream().collect(Collectors.toMap(
        e -> e.getDelFlag() + "-" + e.getRemark(),
        e -> e,
        (existing, replacement) -> existing
    )).values();
    list = CollUtil.newArrayList(values);
    PrintUtil.println(StrUtil.format("去重后list是:{}", JSONUtil.toJsonStr(list)));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

付聪1210

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值