java實(shí)用小技巧之判斷l(xiāng)ist是否有重復(fù)項(xiàng)簡(jiǎn)單例子
在項(xiàng)目中經(jīng)常會(huì)遇到這樣的場(chǎng)景,就是一個(gè)list,根據(jù)某種規(guī)則,我要去判斷里面是不是有重復(fù)的項(xiàng)。
難度不高,但有點(diǎn)煩,所以專門開一篇文章來記錄一下,爭(zhēng)取弄一個(gè)相對(duì)簡(jiǎn)潔的寫法。
先看一個(gè)簡(jiǎn)單的例子:
//有一個(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 來對(duì) `rawList` 進(jìn)行操作。
首先,使用 `stream()` 把 `rawList` 轉(zhuǎn)換為一個(gè) `Stream`。然后,我們用map方法對(duì)每個(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()` 方法對(duì)每個(gè)元素進(jìn)行屬性提取,然后使用 `distinct()` 方法去重,最后使用 `collect()` 方法將 Stream 轉(zhuǎn)換為列表并返回。
測(cè)試
//判斷里面是否有重復(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ò)誤。
對(duì)應(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è)對(duì)象來,有點(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot做代理分發(fā)服務(wù)+代理鑒權(quán)的實(shí)現(xiàn)過程
這篇文章主要介紹了springboot做代理分發(fā)服務(wù)+代理鑒權(quán)的實(shí)現(xiàn)過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
Mybatis generator修改Mapper.java文件實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了Mybatis generator修改Mapper.java文件實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
springBoot?@Scheduled實(shí)現(xiàn)多個(gè)任務(wù)同時(shí)開始執(zhí)行
這篇文章主要介紹了springBoot?@Scheduled實(shí)現(xiàn)多個(gè)任務(wù)同時(shí)開始執(zhí)行,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
mybatis寫xml時(shí)數(shù)字類型千萬別用 !=‘‘(不為空串)進(jìn)行判斷的示例詳解
這篇文章主要介紹了mybatis寫xml時(shí)數(shù)字類型千萬別用 !=‘‘(不為空串)進(jìn)行判斷的示例詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
java使用Filter實(shí)現(xiàn)自動(dòng)登錄的方法
這篇文章主要為大家詳細(xì)介紹了java使用Filter實(shí)現(xiàn)自動(dòng)登錄的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
springboot整合shiro登錄失敗次數(shù)限制功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了springboot整合shiro-登錄失敗次數(shù)限制功能,實(shí)現(xiàn)此功能如果是防止壞人多次嘗試,破解密碼的情況,所以要限制用戶登錄嘗試次數(shù),需要的朋友可以參考下2018-09-09
metershpere實(shí)現(xiàn)調(diào)用自定義jar包中的方法
在MeterSphere接口測(cè)試中,面對(duì)多層循環(huán)邏輯和邏輯判斷等復(fù)雜情況,直接編寫測(cè)試用例往往顯得混亂不便,本文介紹了一個(gè)簡(jiǎn)化這一過程的方法:首先使用IDEA創(chuàng)建Maven工程,編寫所需邏輯并生成jar包;然后在MeterSphere中上傳此jar包2024-10-10

