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. C#的JSON数据处理

    假设一个Model: public class Person { public int Age { get; set; } public string Name { get; set; } } JSO ...

  2. PKU-2723 Get Luffy Out(2-SAT+二分)

    Get Luffy Out 题目链接 Ratish is a young man who always dreams of being a hero. One day his friend Luffy ...

  3. RocketMQ消息模型

    rocketmq采用的是发布-订阅的模式,不需要每个消费者维护自己的消息队列,生产者将消息发送到topic,消费者订阅此topic 读取消息. 基本概念: 消息模型:消息模型包括producer,co ...

  4. asp获取隐藏域的json 并解析

    方法粗糙,适用度适中. var data2 = document.getElementById("hd_data02"); var val = data2.value; var o ...

  5. java容器(二) Map类框架图解

  6. 页面置换算法之Clock算法

    1.前言 缓冲池是数据库最终的概念,数据库可以将一部分数据页放在内存中形成缓冲池,当需要一个数据页时,首先检查内存中的缓冲池是否有这个页面,如果有则直接命中返回,没有则从磁盘中读取这一页,然后缓存到内 ...

  7. Java面试技巧—如何自我介绍

    在企业面试环节中“自我介绍”这个老生常谈的话题就不用多说什么了,面试官必定会问的.那么如何在自我介绍的时候就能够打动面试官,吸引面试官对面试者的兴趣?如何进行自我介绍比较好?有没有什么方式方法呢?当然 ...

  8. Win32实现迷宫

    跟着杨立祥老师的课程,为了完成扫雷的作业,打算先用DFS/BFS实现路径搜索的简单Demo. 生成迷宫: /* 扫雷程序生成方砖 */ #include <stdio.h> #includ ...

  9. HDU_5729_rmq+二分

    http://acm.hdu.edu.cn/showproblem.php?pid=5726 rmq修改成gcd的,关键是找个数,用二分来找,刚开始理解了好久,因为每个区间内gcd是递减的,所以可以优 ...

  10. 【WPF学习】第四十三章 路径和几何图形

    前面四章介绍了继承自Shape的类,包括Rectangle.Ellipse.Polygon以及Polyline.但还有一个继承自Shape的类尚未介绍,而且该类是到现在为止功能最强大的形状类,即Pat ...