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. Centos7安装 Anaconda + jupyter notebook

    一.安装Anaconda 1 下载Anaconda安装脚本 为了避免漫长的等待,镜像源选择国内的清华镜像源,镜像源地址:https://mirrors.tuna.tsinghua.edu.cn/ana ...

  2. [集训]Evocation

    题意 一颗有根树,每个点有黑白两种颜色和阀值ai,若它的子树中(不包括自己)的黑色数量大于ai,则产生一点贡献.每次将一个点的颜色取反,求每次修改后的贡献.n,q<=1E5. 思考 树剖后直接分 ...

  3. 数据结构与算法 --- js描述队列

    js描述队列 队列的特性是只能在队尾插入元素,在队首删除元素,先进先出: 队列被用在很多地方,比如提交操作系统执行的一系列进程,打印任务池,模拟现实中的排队: //队列类 function Queue ...

  4. Java 构造方法总结

    Java 构造方法总结 ①方法名和 类名相同 ②在方法名的前面没有返回值类型的声明 ③在方法中不能使用return语句返回一个值 ④在创建对象时,要调用new,如:book b1=new book() ...

  5. TypeScript——基本类型

    关于数据类型 原始类型 let bool: boolean = true; let num: number = 1; let str: string = 'i am string'; 引用类型 let ...

  6. time 模块 和 random 模块常用方法讲解

    import timeprint(help(time))print(time.time())#时间戳 1573991312.5361328print(time.perf_counter())#计算CP ...

  7. Docker 容器数据 持久化(系统学习Docker05)

    写在前面 本来是可以将数据存储在 容器内部 的.但是存在容器内部,一旦容器被删除掉或者容器毁坏(我亲身经历的痛,当时我们的大数据平台就是运行在docker容器内,有次停电后,不管怎样容器都起不来.以前 ...

  8. tensorflow feed_dict()

    import tensorflow as tf a=tf.Variable(100) b=tf.Variable(200) c=tf.Variable(300) update1=tf.assign(c ...

  9. Codeforces 1092 D2 Great Vova Wall (Version 2) (栈)

    题意: 给一排砖,每列的高度$a_i$,问是否可以放1*2的砖,使得n列高度一样,砖只能横着放 思路: 每两个相邻的高度相同的砖可以变成大于等于它的高度的任意高度 所以像这样的 123321 是不满足 ...

  10. 免费网盘!无限申请5TB容量并且不限速的网盘!

    鸽了好久没有更新博客了哎…… 前言 这里我先说一下下,本人深受百度网盘坑害,自己上传的文件,16GB下载花了3天时间 最后下载失败? 所以找到的一个新的储存个人文件的方法. 这个网盘是onedrive ...