Java List<Object>去掉重复对象-java8
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。
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相关推荐
- 设计模式-创建型模式-原型模式(Java)(创建重复对象)
目录 原型模式 1 介绍 2 实现 具体实现步骤 原型模式 原型模式(Prototype Pattern)是⽤于创建重复的对象,同时⼜能保证性能.这种类型的设计模式属于创建型模式,它提供了⼀种创建对象 ...
- java什么情况下传入对象_java中传输对象时候的问题(转)
对于同一个socket,如果调用两次就会抛出StreamCorruptedException 如果你使用socket,并通过对象输入/输出流来处理的话,并且已经对某个socket调用了一次getInp ...
- java去除重复对象_Java19-2 集合类去除重复对象
List独有方法: import java.util.ArrayList; import java.util.List; public class ListTest2 { public static ...
- java list 合并去重复_java 实现多个list 合并成一个去掉重复的案例
java 实现多个list 合并成一个去掉重复的案例,我就,说了,不多,给大家,代码 java 实现多个list 合并成一个去掉重复的案例 易采站长站,站长之家为您整理了java 实现多个list 合 ...
- java如果把字符串转成对象_Java中的重复对象:不仅仅是字符串
当Java应用程序消耗大量内存时,它本身就会出现问题,并可能导致GC压力增加和GC暂停时间过长.在我之前的一篇文章中,我讨论了Java中常见的内存浪费源:重复字符串.两个 java.lang.Stri ...
- java list 重复对象_list集合去除重复对象的实现
对象重复是指对象里面的变量的值都相等,并不定是地址.list集合存储的类型是基础类型还比较好办,直接把list集合转换成set集合就会自动去除. 当set集合存储的是对象类型时,需要在对象的实体类里面 ...
- 【Java】Java 的Object对象你真的懂了吗
1.概述 原文:https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247484210&idx=1&sn=9d40e2 ...
- JVM - 剖析Java对象头Object Header之对象大小
文章目录 Pre 总览 对象头剖析 查看对象内存的占用情况 对象头C++源码 注释 Pre JVM - 写了这么多年代码,你知不道new对象背后的逻辑? 中大体介绍了Java中 new 对象背后的主要 ...
- java 遍历对象_java中some(),every()循环遍历,Object.getOwnPropertyNames()遍历对象的属性...
由于java知识的应用具有一定的广泛性,所以它经常会应用到我们的日常使用当中.那么今天就为大家介绍一下java中some(),every()循环遍历,Object.getOwnPropertyName ...
最新文章
- java中常见类型转换
- 神经网络通用近似定理
- mysqldump: Couldn't execute 'SET OPTION SQL_QUOTE_SHOW_CREATE=1'
- Vue中的Js动画与Velocity.js 的结合
- [react] 有在项目中使用过Antd吗?说说它的好处
- WinForm 使用 HttpUtility
- python还可以这么玩?用Python把视频转换为字符动画(含音频、高清、彩图)【附源码】
- 苹果iPad忘记了Apple ID密码该怎么办?(手机教程)
- alpine日志中文乱码的问题解决方案
- 位运算实现加减乘除运算——超详细C语言描述
- zencart模板列表下载地址
- Google, with new Pixel and camera, is serious about devices
- 新浪微创投狩猎季:5家LP皆VC大佬 人气日渐高涨
- Hello Shader之Hello Trangle
- AD 绘制原理图库default designator不显示
- 怎么抠图图片?抠图图片这样做就可以完成
- 这样的C盘或许还有?救救C盘......
- 文秘计算机操作试题,文秘招聘试题及答案.doc
- 2018中国科幻产业报告
- Google PR值
热门文章
- java下拉列表 动态_【示例】教你简单用Java写一个动态更新的下拉列表(无数据库)...
- 阿里巴巴消息中间件: Spring Cloud Stream
- php进阶面向对象及tp5,TP5实战技巧---开发思路 引路造桥
- **【POJ - 3122】 Pie(二分寻值)
- C++中string类的length()与size()方法和C语言的strlen()函数有什么区别?
- 【CodeForces - 122B 】Lucky Substring (字符串,水题)
- 专转本计算机第一章试题,江苏专转本 计算机第一章自测题(含答案).doc
- android 退出函数,android – 关闭应用程序与退出按钮
- 计算当前时间到指定日期之间距离多久(494天11866小时711960分钟42717625秒)
- mysql 5.6.36安装图解_2017年12月聚合文章--实战-Mysql5.6.36脚本编译安装及初始化 | 码友网...