欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

下面對象去重的代碼:

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

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

http://www.dbjr.com.cn/article/243751.htm

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

下面要根據(jù)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,達(dá)到過濾的目的。

再來看比較炫酷的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的,還不明白是怎么個原理,等我好好研究一下,再專門寫篇文章好好闡述一下。

還有一種寫法:

? 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 確實簡化了很多冗長的操作,精簡了代碼,小伙,研究java8去吧!

參考:

http://www.dbjr.com.cn/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ù)對象的幾種方法的文章就介紹到這了,更多相關(guān)java8 List<Object>去掉重復(fù)對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java使用Hutool+自定義注解實現(xiàn)數(shù)據(jù)脫敏

    Java使用Hutool+自定義注解實現(xiàn)數(shù)據(jù)脫敏

    我們在使用手機銀行的時候經(jīng)常能看到APP上會將銀行卡的卡號中間部分給隱藏掉使用 ***** 來代替,在某些網(wǎng)站上查看一些業(yè)務(wù)密碼時(例如簽到密碼等)也會使用 ***** 來隱藏掉真正的密碼,那么這種方式是如何實現(xiàn)的呢,本文將給大家介紹使用Hutool+自定義注解實現(xiàn)數(shù)據(jù)脫敏
    2023-09-09
  • 迅速掌握J(rèn)ava容器中常用的ArrayList類與Vector類用法

    迅速掌握J(rèn)ava容器中常用的ArrayList類與Vector類用法

    這篇文章主要介紹了Java容器中常用的ArrayList類與Vector類用法,文中只對其最基本的功能給出了示例代碼,需要的朋友可以參考下
    2015-11-11
  • Mybatis打印替換占位符后的完整Sql教程

    Mybatis打印替換占位符后的完整Sql教程

    這篇文章主要介紹了Mybatis打印替換占位符后的完整Sql教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • IDEA的常見的設(shè)置和優(yōu)化功能圖文詳解

    IDEA的常見的設(shè)置和優(yōu)化功能圖文詳解

    這篇文章主要介紹了IDEA的常見的設(shè)置和優(yōu)化功能,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 詳解在Spring Boot框架下使用WebSocket實現(xiàn)消息推送

    詳解在Spring Boot框架下使用WebSocket實現(xiàn)消息推送

    這篇文章主要介紹了詳解在Spring Boot框架下使用WebSocket實現(xiàn)消息推送,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-12-12
  • Jax-rs規(guī)范下REST接口使用方法詳解

    Jax-rs規(guī)范下REST接口使用方法詳解

    這篇文章主要介紹了Jax-rs規(guī)范下REST接口使用方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • 簡單易懂的java8新特性之lambda表達(dá)式知識總結(jié)

    簡單易懂的java8新特性之lambda表達(dá)式知識總結(jié)

    一直想針對lambda表達(dá)式作一個總結(jié),借助于這次公司安排的考試作一個入門式的總結(jié),對正在學(xué)習(xí)java的小伙伴們非常有幫助,需要的朋友可以參考下
    2021-05-05
  • 詳解SpringCloud是如何動態(tài)更新配置的

    詳解SpringCloud是如何動態(tài)更新配置的

    spring cloud在config配置管理的基礎(chǔ)上,提供了consul config的配置管理和動態(tài)監(jiān)聽,那么這里面到底是怎樣實現(xiàn)的,本文將為你揭秘,感興趣的小伙伴可以跟著小伙伴一起來學(xué)習(xí)
    2023-06-06
  • Java進階之FileUpload完成上傳的實例

    Java進階之FileUpload完成上傳的實例

    這篇文章主要介紹了 Java進階之FileUpload完成上傳的實例的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Java中EnumMap和EnumSet枚舉操作類的簡單使用詳解

    Java中EnumMap和EnumSet枚舉操作類的簡單使用詳解

    這篇文章主要介紹了Java中EnumMap和EnumSet枚舉操作類的簡單使用詳解,EnumMap是Map接口的一種實現(xiàn),專門用于枚舉類型的鍵,所有枚舉的鍵必須來自同一個枚舉?EnumMap不允許鍵為空,允許值為空,需要的朋友可以參考下
    2023-11-11

最新評論