前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

public List<String> removeStringListDupli(List<String> stringList) {Set<String> set = new LinkedHashSet<>();set.addAll(stringList);stringList.clear();stringList.addAll(set);return stringList;
}

或使用Java8的写法:

      List<String> unique = list.stream().distinct().collect(Collectors.toList());

二、List中对象去重

比如现在有一个 Person类:

public class Person {private Long id;private String name;public Person(Long id, String name) {this.id = id;this.name = name;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Person{" +"id=" + id +", name='" + name + '\'' +'}';}
}

重写Person对象的equals()方法和hashCode()方法:

 @Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;if (!id.equals(person.id)) return false;return name.equals(person.name);}@Overridepublic int hashCode() {int result = id.hashCode();result = 31 * result + name.hashCode();return result;}

下面对象去重的代码:

Person p1 = new Person(1l, "jack");Person p2 = new Person(3l, "jack chou");Person p3 = new Person(2l, "tom");Person p4 = new Person(4l, "hanson");Person p5 = new Person(5l, "胶布虫");List<Person> persons = Arrays.asList(p1, p2, p3, p4, p5, p5, p1, p2, p2);List<Person> personList = new ArrayList<>();// 去重persons.stream().forEach(p -> {if (!personList.contains(p)) {personList.add(p);}});System.out.println(personList);

List 的contains()方法底层实现使用对象的equals方法去比较的,其实重写equals()就好,但重写了equals最好将hashCode也重写了。

三、根据对象的属性去重

下面要根据Person对象的id去重,那该怎么做呢? 
写一个方法吧:

  public static List<Person> removeDupliById(List<Person> persons) {Set<Person> personSet = new TreeSet<>((o1, o2) -> o1.getId().compareTo(o2.getId()));personSet.addAll(persons);return new ArrayList<>(personSet);}

通过Comparator比较器,比较对象属性,相同就返回0,达到过滤的目的。

再来看比较炫酷的Java8写法:

import static java.util.Comparator.comparingLong;
import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toCollection;// 根据id去重List<Person> unique = persons.stream().collect(collectingAndThen(toCollection(() -> new TreeSet<>(comparingLong(Person::getId))), ArrayList::new));

这段炫酷的代码是google的,还不明白是怎么个原理,等我好好研究一下,再专门写篇文章好好阐述一下。

还有一种写法:

 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;}// remove duplicatepersons.stream().filter(distinctByKey(p -> p.getId())).forEach(p -> System.out.println(p));

Java List<Object>去掉重复对象-java8相关推荐

  1. 设计模式-创建型模式-原型模式(Java)(创建重复对象)

    目录 原型模式 1 介绍 2 实现 具体实现步骤 原型模式 原型模式(Prototype Pattern)是⽤于创建重复的对象,同时⼜能保证性能.这种类型的设计模式属于创建型模式,它提供了⼀种创建对象 ...

  2. java什么情况下传入对象_java中传输对象时候的问题(转)

    对于同一个socket,如果调用两次就会抛出StreamCorruptedException 如果你使用socket,并通过对象输入/输出流来处理的话,并且已经对某个socket调用了一次getInp ...

  3. java去除重复对象_Java19-2 集合类去除重复对象

    List独有方法: import java.util.ArrayList; import java.util.List; public class ListTest2 { public static ...

  4. java list 合并去重复_java 实现多个list 合并成一个去掉重复的案例

    java 实现多个list 合并成一个去掉重复的案例,我就,说了,不多,给大家,代码 java 实现多个list 合并成一个去掉重复的案例 易采站长站,站长之家为您整理了java 实现多个list 合 ...

  5. java如果把字符串转成对象_Java中的重复对象:不仅仅是字符串

    当Java应用程序消耗大量内存时,它本身就会出现问题,并可能导致GC压力增加和GC暂停时间过长.在我之前的一篇文章中,我讨论了Java中常见的内存浪费源:重复字符串.两个 java.lang.Stri ...

  6. java list 重复对象_list集合去除重复对象的实现

    对象重复是指对象里面的变量的值都相等,并不定是地址.list集合存储的类型是基础类型还比较好办,直接把list集合转换成set集合就会自动去除. 当set集合存储的是对象类型时,需要在对象的实体类里面 ...

  7. 【Java】Java 的Object对象你真的懂了吗

    1.概述 原文:https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247484210&idx=1&sn=9d40e2 ...

  8. JVM - 剖析Java对象头Object Header之对象大小

    文章目录 Pre 总览 对象头剖析 查看对象内存的占用情况 对象头C++源码 注释 Pre JVM - 写了这么多年代码,你知不道new对象背后的逻辑? 中大体介绍了Java中 new 对象背后的主要 ...

  9. java 遍历对象_java中some(),every()循环遍历,Object.getOwnPropertyNames()遍历对象的属性...

    由于java知识的应用具有一定的广泛性,所以它经常会应用到我们的日常使用当中.那么今天就为大家介绍一下java中some(),every()循环遍历,Object.getOwnPropertyName ...

最新文章

  1. java中常见类型转换
  2. 神经网络通用近似定理
  3. mysqldump: Couldn't execute 'SET OPTION SQL_QUOTE_SHOW_CREATE=1'
  4. Vue中的Js动画与Velocity.js 的结合
  5. [react] 有在项目中使用过Antd吗?说说它的好处
  6. WinForm 使用 HttpUtility
  7. python还可以这么玩?用Python把视频转换为字符动画(含音频、高清、彩图)【附源码】
  8. 苹果iPad忘记了Apple ID密码该怎么办?(手机教程)
  9. alpine日志中文乱码的问题解决方案
  10. 位运算实现加减乘除运算——超详细C语言描述
  11. zencart模板列表下载地址
  12. Google, with new Pixel and camera, is serious about devices
  13. 新浪微创投狩猎季:5家LP皆VC大佬 人气日渐高涨
  14. Hello Shader之Hello Trangle
  15. AD 绘制原理图库default designator不显示
  16. 怎么抠图图片?抠图图片这样做就可以完成
  17. 这样的C盘或许还有?救救C盘......
  18. 文秘计算机操作试题,文秘招聘试题及答案.doc
  19. 2018中国科幻产业报告
  20. Google PR值

热门文章

  1. java下拉列表 动态_【示例】教你简单用Java写一个动态更新的下拉列表(无数据库)...
  2. 阿里巴巴消息中间件: Spring Cloud Stream
  3. php进阶面向对象及tp5,TP5实战技巧---开发思路 引路造桥
  4. **【POJ - 3122】 Pie(二分寻值)
  5. C++中string类的length()与size()方法和C语言的strlen()函数有什么区别?
  6. 【CodeForces - 122B 】Lucky Substring (字符串,水题)
  7. 专转本计算机第一章试题,江苏专转本 计算机第一章自测题(含答案).doc
  8. android 退出函数,android – 关闭应用程序与退出按钮
  9. 计算当前时间到指定日期之间距离多久(494天11866小时711960分钟42717625秒)
  10. mysql 5.6.36安装图解_2017年12月聚合文章--实战-Mysql5.6.36脚本编译安装及初始化 | 码友网...