package com.sb.test;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.alibaba.fastjson.JSON; /**
* @version 1.0.
* @className :MyTest
* @Date :2019/10/2
**/
public class MyTest {
public final static Logger logger = LoggerFactory.getLogger(MyTest.class); public static void main(String[] args) {
logger.info("------------List String 去重---------------------");
List<String> list = new ArrayList<>();
list.add("123");
list.add("432");
list.add("123");
list.stream().forEach(str -> System.out.println(str));
Set<String> set = new HashSet<>(list);
list.clear();
list.addAll(set);
list.stream().forEach(str -> System.out.println(str)); logger.info("*****************List<TestModel> 去重***********************************");
List<TestModel> list2 = new ArrayList<>();
TestModel testModel = new TestModel();
testModel.setAge(11);
testModel.setName("我爱你中国");
TestModel testModel2 = new TestModel();
testModel2.setAge(11);
testModel2.setName("我爱你中国");
list2.add(testModel);
list2.add(testModel2);
list2.stream().forEach(item -> {
logger.info(item.getName() + item.getAge());
}); logger.info("---------------根据对象的某个属性去重,例如:age-------------------------");
List<TestModel> listNew = new ArrayList<>();
Set<TestModel> testModelSet = new TreeSet<>((o1, o2) -> o1.getAge().compareTo(o2.getAge()));
testModelSet.addAll(list2);
listNew.addAll(testModelSet);
listNew.stream().forEach(item11 -> {
logger.info(item11.getName() + item11.getAge());
});
logger.info("----------------根据对象多个属性去重 属性:age + name--------------");
List<TestModel> listNew2 = new ArrayList<>();
List<TestModel> testModels = removeDupliByMoreModel(list2);
logger.info(JSON.toJSONString(testModels)); logger.info("----------------根据对象单个属性去重属性:name--------------");
List<TestModel> testModels1 = removeDupliByNameNew(list2);
logger.info(JSON.toJSONString(testModels1));
} /**
* List集合去重
*/
public static List<TestModel> removeDupliByMoreModel(List<TestModel> list) {
List<TestModel> listModel = list.stream().collect(Collectors
.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> {
return (o.getAge() + "-" + o.getName());
}))), ArrayList::new));
return new ArrayList<>(listModel);
} /**
* 根据对象单个属性去重属性:name
*/
public static List<TestModel> removeDupliByNameNew(List<TestModel> list) {
List<TestModel> personList = new ArrayList<>();
list.stream().filter(distinctByKey(p -> p.getName())).forEach(p -> personList.add(p));
return personList;
} /**
* 据key去重重复
*/
public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
Map<Object, Boolean> map = new ConcurrentHashMap<>();
return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
} }
package com.sb.test;

/**
* @version 1.0.
* @className :TestModel
* @Description: TODD
* @Date :2019/10/15 0015
**/
public class TestModel {
private Integer age;
private String name; public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

List集合去重各种方式汇总的更多相关文章

  1. List集合去重方式及效率对比

    List集合相信大家在开发过程中几乎都会用到.有时候难免会遇到集合里的数据是重复的,需要进行去除.然而,去重方式有好几种方式,你用的是哪种方式呢?去重方式效率是否是最高效.最优的呢?今天就给大家讲解一 ...

  2. List集合去重的一种方法

    前一段时间们需要对一个List<Model>集合去重,情况是该集合中会出现多个Name属性值相同的,但是其他属性值不同的数据. 在这种情况下,需求要只保留其中一个就好. 我觉得遍历和Has ...

  3. List集合去重的一种方法 z

    需要对一个List<Model>集合去重,情况是该集合中会出现多个Name属性值相同的,但是其他属性值不同的数据. 在这种情况下,需求要只保留其中一个就好. 我觉得遍历和HashSet都不 ...

  4. List集合去重

    本篇包含了两种去重,一种是List集合去重,一种是两个List集合去重合并 List集合去重,一般是两种方式,一种是遍历list集合判断后赋给另一个list集合,一种是用赋给set集合再返回给list ...

  5. List集合去重的一些方法(常规遍历、Set去重、java8 stream去重、重写equals和hashCode方法)

    1. 常规元素去重 碰到List去重的问题,除了遍历去重,我们常常想到利用Set集合不允许重复元素的特点,通过List和Set互转,来去掉重复元素. // 遍历后判断赋给另一个list集合,保持原来顺 ...

  6. C# List集合去重操作注意点

    今天调试代码时发现list的distinct方法在对引用类型操作时并没有去重,后来查阅资料发现list去重操作对象集合时比较的是对象的一个个引用地址, 因为集合里的对象都是一个个单独的实例,所以并不会 ...

  7. js实现数组去重的方式(7种)

    JS数组去重的方式 例:将下面数组去除重复元素(以多种数据类型为例) const arr = [1, 2, 2, 'abc', 'abc', true, true, false, false, und ...

  8. Map集合的遍历方式:

    迭代器来遍历 : entrySet() ; keySet(); values(); eg.HashMap<String,String> map = new HashMap<Strin ...

  9. Android中三种超实用的滑屏方式汇总(转载)

    Android中三种超实用的滑屏方式汇总   现如今主流的Android应用中,都少不了左右滑动滚屏这项功能,(貌似现在好多人使用智能机都习惯性的有事没事的左右滑屏,也不知道在干什么...嘿嘿),由于 ...

随机推荐

  1. TCP/IP、TCP、UDP、Socket知识汇总

    带你了解TCP/IP,UDP,Socket之间关系 https://blog.csdn.net/chaoshenzhaoxichao/article/details/79785318 主要知识点: T ...

  2. 在python开发工具PyCharm中搭建QtPy环境(详细)

    在python开发工具PyCharm中搭建QtPy环境(详细) 在Python的开发工具PyCharm中安装QtPy5(版本5):打开“File”——“Settings”——“Project Inte ...

  3. springboot集成quartz实现任务调度

    quartz 概述 特点 强大的调度功能 灵活的应用方式 分布式和集群能力 用到的设计模式 Builder 模式 factory模式 组件模式 链式写法 体系结构 调度器 任务 触发器 架构图 spr ...

  4. C语言博客作业8

    本周作业头 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 作业地址 我在这个课程的目标是 熟练运用C语言来写代码 这个作业在那个具体方面帮助我实现目标 while语句的运用 参考文献 ...

  5. Git详解之安装

    前言 是时候动手尝试下 Git 了,不过得先安装好它.有许多种安装方式,主要分为两种,一种是通过编译源代码来安装:另一种是使用为特定平台预编译好的安装包. 从源代码安装 若是条件允许,从源代码安装有很 ...

  6. 异常处理 | java.lang.IllegalArgumentException: Request header is too large

    背景 今天在自己使用Springboot开发博客系统的时候,在浏览器点击提交markdown文件一直出现以下异常: java.lang.IllegalArgumentException: Reques ...

  7. 在华为云上开启FTP服务并建立FTP站点来从本地向服务器发送和下载文件

    时间:2019/12/8 最近学习计算机网络的时候老师布置了一个实践作业,具体要求是两个人一组,一个在电脑上建立FTP站点,另一个开启FTP服务器来进行文件的上传和下载. 看到这个的时候我灵机一动,正 ...

  8. react中,路由的使用。import {BrowserRouter,Switch,Route} from "react-router-dom";

      import React from "react"; import ReactDom  from "react-dom"; import {BrowserR ...

  9. vue的v-if和v-show的区别

    引言 vue这两条指令,在面试vue经常会被问道它们的区别,今天我也好好查看了以下文档,做做笔记. 相同点 它们都用于条件渲染,都可以隐藏和显示DOM元素. v-if 通过判断条件成立与否,适当的销毁 ...

  10. supervisor守护filebeat服务进程

    1.变更原因 部署安装supervisor进行filebeat守护及后面的各种服务进程守护可以用2.变更内容增加supervisor服务 3.变量时间:6月2号-6月3号4.变更风险评估:无风险4.1 ...