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

java實(shí)用小技巧之判斷l(xiāng)ist是否有重復(fù)項(xiàng)簡單例子

 更新時(shí)間:2023年10月24日 14:38:48   作者:剽悍一小兔  
這篇文章主要給大家介紹了關(guān)于java實(shí)用小技巧之判斷l(xiāng)ist是否有重復(fù)項(xiàng)的相關(guān)資料,在開發(fā)工作中我們有時(shí)需要去判斷List集合中是否含有重復(fù)的元素,需要的朋友可以參考下

在項(xiàng)目中經(jīng)常會(huì)遇到這樣的場景,就是一個(gè)list,根據(jù)某種規(guī)則,我要去判斷里面是不是有重復(fù)的項(xiàng)。

難度不高,但有點(diǎn)煩,所以專門開一篇文章來記錄一下,爭取弄一個(gè)相對簡潔的寫法。

先看一個(gè)簡單的例子:

//有一個(gè)list,里面是long類型的數(shù)字集合
List<Long> numbers = new ArrayList<>();
numbers.add(1L);
numbers.add(2L);
numbers.add(2L);
numbers.add(3L);
numbers.add(4L);
numbers.add(5L);
 
//判斷里面是否有重復(fù)
DistinctUtil util = new DistinctUtil();
System.out.println(util.distinctList(numbers).size() == numbers.size());

DistinctUtil是另外寫的一個(gè)工具類,以下是distinctList方法:

public List<T> distinctList(List<T> rawList) {
    return rawList.stream().map(item -> item).distinct().collect(Collectors.toList());
}

 這是一個(gè)泛型方法 `distinctList`,它接受一個(gè) `List` 類型的參數(shù) `rawList`,返回一個(gè)經(jīng)過去重處理的 `List`。 具體來說,該方法使用 Java 8 中的 Stream API 來對 `rawList` 進(jìn)行操作。

首先,使用 `stream()` 把 `rawList` 轉(zhuǎn)換為一個(gè) `Stream`。然后,我們用map方法對每個(gè)元素進(jìn)行了一個(gè)映射,就是把元素本身映射為元素本身,這一步看似無意義,但其實(shí)它是為了強(qiáng)制把 List 轉(zhuǎn)化為 Stream。

接下來,在數(shù)據(jù)流中使用 `distinct()` 去重,最后用 `collect(Collectors.toList())` 方法把處理后的數(shù)據(jù)流轉(zhuǎn)換為 `List` 類型并返回。

因?yàn)閚umbers是有重復(fù)元素的,所以結(jié)果是false。

進(jìn)一步優(yōu)化,如果的復(fù)雜類型怎么辦呢?

比如有一個(gè)User類:

@Data
@Builder
public class User {
    String name;
    Integer age;
}

我要根據(jù)姓名是否有重復(fù)來判斷,就得修改一下邏輯。

public List<T> distinctComplexList(List<T> rawList, Function<? super T,?> mapLogic) {
    return (List<T>) rawList.stream().map(item -> mapLogic.apply(item)).distinct().collect(Collectors.toList());
}

這個(gè)方法可以用來從一個(gè)包含復(fù)雜元素的列表中提取指定屬性,去重并返回新列表。 該方法接收兩個(gè)參數(shù):原始列表 `rawList` 和用于提取指定屬性的函數(shù)接口 `mapLogic`。該方法使用 Java 8 的 Stream API 處理原始列表,首先使用 `map()` 方法對每個(gè)元素進(jìn)行屬性提取,然后使用 `distinct()` 方法去重,最后使用 `collect()` 方法將 Stream 轉(zhuǎn)換為列表并返回。

測試

//判斷里面是否有重復(fù)
DistinctUtil<User> util = new DistinctUtil();
 
List<User> users = Arrays.asList(
        User.builder().name("魯班七號(hào)").age(10).build(),
        User.builder().name("魯班七號(hào)").age(10).build(),
        User.builder().name("安其拉").age(10).build()
);
 
Function<User, String> getName = User::getName;
System.out.println(util.distinctComplexList(users, User::getName ).size() == users.size());

注意,使用DistinctUtil的時(shí)候,一定要加泛型,不然User::getName的使用會(huì)有問題,會(huì)報(bào)一個(gè)Non-static method cannot be referenced from a static context的錯(cuò)誤。

對應(yīng)的,可以再封裝兩個(gè)判斷是否重復(fù)的方法:

public boolean isRepeat(List<T> rawList){
    return distinctList(rawList).size() < rawList.size();
}
 
public boolean isRepeat(List<T> rawList, Function<? super T,?> mapLogic){
    return distinctList(rawList).size() < rawList.size();
}

現(xiàn)在還有個(gè)問題,每次用這個(gè)工具類,還得先new出一個(gè)對象來,有點(diǎn)麻煩。

我之前試過,方法如果加了static,就不能用T了。其實(shí)這并不是說靜態(tài)方法不能用類的泛型參數(shù),而是如果你要用類的泛型參數(shù),這個(gè)方法也得是泛型方法。

舉個(gè)栗子:

public static <T>  List<T> distinctList(List<T> rawList) {
    return rawList.stream().map(item -> item).distinct().collect(Collectors.toList());
}

搞定了。

本文主要就是做一個(gè)記錄,我是jdk1.7的忠實(shí)粉絲,lamda表達(dá)式用起來還是有點(diǎn)磕磕絆絆,后面要加油了。 

總結(jié)

到此這篇關(guān)于java實(shí)用小技巧之判斷l(xiāng)ist是否有重復(fù)項(xiàng)的文章就介紹到這了,更多相關(guān)java判斷l(xiāng)ist有重復(fù)項(xiàng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis?Plus?逆向工程介紹

    Mybatis?Plus?逆向工程介紹

    這篇文章主要介紹了Mybatis?Plus?逆向工程,文章通過Mybatis?Plus?逆向工程相關(guān)資料及示例代碼詳細(xì)介紹,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考一下
    2022-01-01
  • Springboot整合Spring Cloud Kubernetes讀取ConfigMap支持自動(dòng)刷新配置的教程

    Springboot整合Spring Cloud Kubernetes讀取ConfigMap支持自動(dòng)刷新配置的教程

    這篇文章主要介紹了Springboot整合Spring Cloud Kubernetes讀取ConfigMap支持自動(dòng)刷新配置,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • slf4j與log4j全面了解

    slf4j與log4j全面了解

    下面小編就為大家?guī)硪黄猻lf4j與log4j全面了解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-07-07
  • 基于Java SSM實(shí)現(xiàn)在線點(diǎn)餐系統(tǒng)

    基于Java SSM實(shí)現(xiàn)在線點(diǎn)餐系統(tǒng)

    本項(xiàng)目基于Java SSM框架實(shí)現(xiàn)在線點(diǎn)餐系統(tǒng),主要實(shí)現(xiàn)系統(tǒng)的在線點(diǎn)餐功能。文中的示例代碼講解詳細(xì),感興趣的可以跟隨小編一起學(xué)習(xí)一下
    2022-02-02
  • 使用Java8中Optional機(jī)制的正確姿勢

    使用Java8中Optional機(jī)制的正確姿勢

    我們知道 Java 8 增加了一些很有用的 API, 其中一個(gè)就是 Optional,下面這篇文章主要給大家介紹了關(guān)于如何正確使用Java8中Optional機(jī)制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-11-11
  • Java實(shí)現(xiàn)Excel文件轉(zhuǎn)PDF(無水印無限制)

    Java實(shí)現(xiàn)Excel文件轉(zhuǎn)PDF(無水印無限制)

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語言實(shí)現(xiàn)Excel文件轉(zhuǎn)PDF的效果,并可以無水印、無限制。文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-06-06
  • Java如何實(shí)現(xiàn)保證線程安全

    Java如何實(shí)現(xiàn)保證線程安全

    這篇文章主要介紹了Java如何實(shí)現(xiàn)保證線程安全問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Java中的system.getProperty()的作用及使用方法

    Java中的system.getProperty()的作用及使用方法

    System.getProperty()?方法用于獲取系統(tǒng)屬性的值,該方法接受一個(gè)字符串參數(shù),表示要獲取的系統(tǒng)屬性的名稱,返回值為字符串類型,表示該屬性的值,接下來通過本文給大家介紹Java中的system.getProperty()的作用及使用方法,感興趣的朋友跟隨小編一起看看吧
    2023-05-05
  • Java 10 局部變量類型推斷淺析

    Java 10 局部變量類型推斷淺析

    這篇文章主要介紹了Java 10 局部變量類型推斷淺析,Java 10 引進(jìn)一種新的閃閃發(fā)光的特性叫做局部變量類型推斷。文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06
  • Java中String、StringBuffer、StringBuilder的區(qū)別介紹

    Java中String、StringBuffer、StringBuilder的區(qū)別介紹

    這篇文章主要介紹了Java中String、StringBuffer、StringBuilder的區(qū)別介紹,本文講解了可變與不可變、是否多線程安全、gBuilder與StringBuffer共同點(diǎn)等內(nèi)容,需要的朋友可以參考下
    2015-06-06

最新評(píng)論