最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java8 List<Object>去掉重復(fù)對(duì)象的幾種方法

 更新時(shí)間:2022年04月08日 11:25:48   作者:Balalalalalalalala  
本文主要介紹了java8 List<Object>去掉重復(fù)對(duì)象的幾種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、去除List中重復(fù)的String

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中對(duì)象去重

比如現(xiàn)在有一個(gè) 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;
? ? }

? ? @Override
? ? public String toString() {
? ? ? ? return "Person{" +
? ? ? ? ? ? ? ? "id=" + id +
? ? ? ? ? ? ? ? ", name='" + name + '\'' +
? ? ? ? ? ? ? ? '}';
? ? }
}

重寫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, "膠布蟲");

? ? ? ? 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()方法底層實(shí)現(xiàn)使用對(duì)象的equals方法去比較的,其實(shí)重寫equals()就好,但重寫了equals最好將hashCode也重寫了。

可以參見:http://stackoverflow.com/questions/30745048/how-to-remove-duplicate-objects-from-java-arraylist

http://m.fzitv.net/article/243751.htm

三、根據(jù)對(duì)象的屬性去重

下面要根據(jù)Person對(duì)象的id去重,那該怎么做呢?

寫一個(gè)方法吧:

? 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);
? ? }

通過(guò)Comparator比較器,比較對(duì)象屬性,相同就返回0,達(dá)到過(guò)濾的目的。

再來(lái)看比較炫酷的Java8寫法:

import static java.util.Comparator.comparingLong;
import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toCollection;

// 根據(jù)id去重
? ? ?List<Person> unique = persons.stream().collect(
? ? ? ? ? ? ? ? collectingAndThen(
? ? ? ? ? ? ? ? ? ? ? ? toCollection(() -> new TreeSet<>(comparingLong(Person::getId))), ArrayList::new)
? ? ? ? );

這段炫酷的代碼是google的,還不明白是怎么個(gè)原理,等我好好研究一下,再專門寫篇文章好好闡述一下。

還有一種寫法:

? 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 duplicate
? ? ? ? persons.stream().filter(distinctByKey(p -> p.getId())).forEach(p -> System.out.println(p));

java8 確實(shí)簡(jiǎn)化了很多冗長(zhǎng)的操作,精簡(jiǎn)了代碼,小伙,研究java8去吧!

參考:

http://m.fzitv.net/article/243751.htm

http://stackoverflow.com/questions/29670116/remove-duplicates-from-a-list-of-objects-based-on-property-in-java-8

到此這篇關(guān)于java8 List<Object>去掉重復(fù)對(duì)象的幾種方法的文章就介紹到這了,更多相關(guān)java8 List<Object>去掉重復(fù)對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用Java手寫一個(gè)簡(jiǎn)易的lombok的示例代碼

    利用Java手寫一個(gè)簡(jiǎn)易的lombok的示例代碼

    Lombok是一款Java開發(fā)插件,使得Java開發(fā)者可以通過(guò)其定義的一系列注解來(lái)消除業(yè)務(wù)工程中冗長(zhǎng)和繁瑣的代碼,尤其對(duì)于簡(jiǎn)單的Java模型對(duì)象。本文就來(lái)手寫一個(gè)簡(jiǎn)易的lombok,需要的可以參考一下
    2022-10-10
  • Tomcat中session的管理機(jī)制

    Tomcat中session的管理機(jī)制

    這篇文章主要為大家詳細(xì)介紹了Tomcat中session的管理機(jī)制 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Java如何獲取Object中Value

    Java如何獲取Object中Value

    在Java中,獲取Object中的值需依賴于對(duì)象的類型和屬性,常用方法包括使用反射、getter方法、接口或抽象類、Map等數(shù)據(jù)結(jié)構(gòu),本文給大家介紹Java如何獲取Object中Value,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • 使用Java制作一個(gè)簡(jiǎn)單的記事本

    使用Java制作一個(gè)簡(jiǎn)單的記事本

    本文給大家?guī)?lái)的是使用Java制作一個(gè)簡(jiǎn)單的記事本的代碼,有相同需要的朋友可以參考下
    2015-02-02
  • Java數(shù)據(jù)結(jié)構(gòu)中圖的進(jìn)階詳解

    Java數(shù)據(jù)結(jié)構(gòu)中圖的進(jìn)階詳解

    在Java學(xué)習(xí)與應(yīng)用中,數(shù)據(jù)結(jié)構(gòu)無(wú)疑是每個(gè)人都要接觸的難點(diǎn),為了更好的學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)這一塊內(nèi)容,用圖來(lái)理解便是最好的方式,讓我們一起來(lái)了解本篇內(nèi)容圖的進(jìn)階
    2022-01-01
  • Java客戶端服務(wù)端上傳接收文件實(shí)現(xiàn)詳解

    Java客戶端服務(wù)端上傳接收文件實(shí)現(xiàn)詳解

    這篇文章主要介紹了Java客戶端服務(wù)端上傳接收文件實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 淺談靜態(tài)變量、成員變量、局部變量三者的區(qū)別

    淺談靜態(tài)變量、成員變量、局部變量三者的區(qū)別

    下面小編就為大家?guī)?lái)一篇淺談靜態(tài)變量、成員變量、局部變量三者的區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • JavaWeb?Hibernate使用全面介紹

    JavaWeb?Hibernate使用全面介紹

    在正式進(jìn)入Hibernate的高級(jí)應(yīng)用之前,需要了解聲明是數(shù)據(jù)模型與領(lǐng)域模型,這兩個(gè)概念將會(huì)幫助我們更好的理解實(shí)體對(duì)象的關(guān)聯(lián)關(guān)系映射
    2022-10-10
  • SpringBoot參數(shù)校驗(yàn)與國(guó)際化使用教程

    SpringBoot參數(shù)校驗(yàn)與國(guó)際化使用教程

    這篇文章主要給大家介紹了關(guān)于SpringBoot參數(shù)校驗(yàn)與國(guó)際化使用教程的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 關(guān)于jvm內(nèi)存如何查看

    關(guān)于jvm內(nèi)存如何查看

    本文介紹了如何在Java虛擬機(jī)(JVM)中進(jìn)行內(nèi)存管理,包括查看JVM內(nèi)存情況的常用方法和工具,這些方法包括使用JDK自帶的工具如jps、jstat、jmap和jconsole,以及一些第三方監(jiān)控工具如Prometheus、Grafana和ElasticStack等,通過(guò)這些方法
    2024-09-09

最新評(píng)論

婺源县| 澄城县| 崇信县| 岳阳市| 关岭| 东乌珠穆沁旗| 东明县| 九龙城区| 泗洪县| 伊川县| 永城市| 南宁市| 台前县| 温州市| 金平| 阿图什市| 余庆县| 兴城市| 中西区| 靖州| 隆安县| 罗山县| 阿鲁科尔沁旗| 资兴市| 高平市| 海南省| 颍上县| 锦屏县| 英吉沙县| 庆安县| 从化市| 剑阁县| 海晏县| 平原县| 东源县| 洛阳市| 南部县| 青海省| 启东市| 喀喇| 文安县|