Hutool工具类处理
代码说明
- CollUtil.distinct方法来源于cn.hutool.core.collection.CollUtil#distinct(java.util.Collection, java.util.function.Function<T,K>, boolean),具体可参考该工具类方法的说明。
- 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(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("备注02");
dto2.setDelFlag(0);
list.add(dto2);
PrintUtil.println(StrUtil.format("去重前list是:{}", JSONUtil.toJsonStr(list)));
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(1);
list.add(dto2);
PrintUtil.println(StrUtil.format("去重前list是:{}", JSONUtil.toJsonStr(list)));
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***())
工具类
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("备注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("备注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)));
}