List 如何根據(jù)對(duì)象的屬性去重?Java 8 輕松搞定!
一、去除List中重復(fù)的String
public?List?removeStringListDupli(List?stringList) ? {
????Set?set?=?new?LinkedHashSet<>();
????set.addAll(stringList);
????stringList.clear();
????stringList.addAll(set);
????return?stringList;
}
或使用Java8的寫(xiě)法:
List?unique?=?list.stream().distinct().collect(Collectors.toList());
二、List中對(duì)象去重
比如現(xiàn)在有一個(gè) Person類(lèi):
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;
????}
????@Override
????public?String?toString()?{
????????return?"Person{"?+
????????????????"id="?+?id?+
????????????????",?name='"?+?name?+?'\''?+
????????????????'}';
????}
}
重寫(xiě)Person對(duì)象的equals()方法和hashCode()方法:
?@Override
public?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);
}
@Override
public?int?hashCode()?{
????int?result?=?id.hashCode();
????result?=?31?*?result?+?name.hashCode();
????return?result;
}
下面對(duì)象去重的代碼:
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,?"膠布蟲(chóng)");
List?persons?=?Arrays.asList(p1,?p2,?p3,?p4,?p5,?p5,?p1,?p2,?p2);
List?personList?=?new?ArrayList<>();
//?去重
persons.stream().forEach(
????p?->?{
????????if?(!personList.contains(p))?{
????????????personList.add(p);
????????}
????}
);
System.out.println(personList);
List 的contains()方法底層實(shí)現(xiàn)使用對(duì)象的equals方法去比較的,其實(shí)重寫(xiě)equals()就好,但重寫(xiě)了equals最好將hashCode也重寫(xiě)了。
我們創(chuàng)建了一個(gè)高質(zhì)量的技術(shù)交流群,與優(yōu)秀的人在一起,自己也會(huì)優(yōu)秀起來(lái),趕緊點(diǎn)擊加群,享受一起成長(zhǎng)的快樂(lè)。
可以參見(jiàn):
http://stackoverflow.com/questions/30745048/how-to-remove-duplicate-objects-from-java-arraylist http://blog.csdn.net/growing_tree/article/details/46622579
三、根據(jù)對(duì)象的屬性去重
下面要根據(jù)Person對(duì)象的id去重,那該怎么做呢?
寫(xiě)一個(gè)方法吧:
??public?static?List?removeDupliById(List?persons) ? {
????????Set?personSet?=?new?TreeSet<>((o1,?o2)?->?o1.getId().compareTo(o2.getId()));
????????personSet.addAll(persons);
????????return?new?ArrayList<>(personSet);
????}
通過(guò)Comparator比較器,比較對(duì)象屬性,相同就返回0,達(dá)到過(guò)濾的目的。
再來(lái)看比較炫酷的Java8寫(xiě)法:
import?static?java.util.Comparator.comparingLong;
import?static?java.util.stream.Collectors.collectingAndThen;
import?static?java.util.stream.Collectors.toCollection;
//?根據(jù)id去重
List?unique?=?persons.stream().collect(
????collectingAndThen(
????????toCollection(()?->?new?TreeSet<>(comparingLong(Person::getId))),?ArrayList::new)
);
這段炫酷的代碼是google的,還不明白是怎么個(gè)原理,等我好好研究一下,再專(zhuān)門(mén)寫(xiě)篇文章好好闡述一下。
還有一種寫(xiě)法:
public?static??Predicate?distinctByKey(Function?super?T,?Object>?keyExtractor)? {
????Map java8 確實(shí)簡(jiǎn)化了很多冗長(zhǎng)的操作,精簡(jiǎn)了代碼,小伙,研究java8去吧!
轉(zhuǎn)自:Balalalalalalalala
鏈接:https://blog.csdn.net/jiaobuchong/article/details/54412094
最近熬夜給大家準(zhǔn)備了非常全的一套Java一線(xiàn)大廠面試題。全面覆蓋BATJ等一線(xiàn)互聯(lián)網(wǎng)公司的面試題及解答,由BAT一線(xiàn)互聯(lián)網(wǎng)公司大牛帶你深度剖析面試題背后的原理,不僅授你以魚(yú),更授你以漁,為你面試掃除一切障礙。
資源,怎么領(lǐng)?。?/span>
掃二維碼,加我微信,備注:面試題
一定要備注:面試題,不要急哦,工作忙完后就會(huì)通過(guò)!

