java實用小技巧之判斷l(xiāng)ist是否有重復(fù)項簡單例子
在項目中經(jīng)常會遇到這樣的場景,就是一個list,根據(jù)某種規(guī)則,我要去判斷里面是不是有重復(fù)的項。
難度不高,但有點煩,所以專門開一篇文章來記錄一下,爭取弄一個相對簡潔的寫法。
先看一個簡單的例子:
//有一個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是另外寫的一個工具類,以下是distinctList方法:
public List<T> distinctList(List<T> rawList) {
return rawList.stream().map(item -> item).distinct().collect(Collectors.toList());
}這是一個泛型方法 `distinctList`,它接受一個 `List` 類型的參數(shù) `rawList`,返回一個經(jīng)過去重處理的 `List`。 具體來說,該方法使用 Java 8 中的 Stream API 來對 `rawList` 進行操作。
首先,使用 `stream()` 把 `rawList` 轉(zhuǎn)換為一個 `Stream`。然后,我們用map方法對每個元素進行了一個映射,就是把元素本身映射為元素本身,這一步看似無意義,但其實它是為了強制把 List 轉(zhuǎn)化為 Stream。
接下來,在數(shù)據(jù)流中使用 `distinct()` 去重,最后用 `collect(Collectors.toList())` 方法把處理后的數(shù)據(jù)流轉(zhuǎn)換為 `List` 類型并返回。
因為numbers是有重復(fù)元素的,所以結(jié)果是false。
進一步優(yōu)化,如果的復(fù)雜類型怎么辦呢?
比如有一個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());
}這個方法可以用來從一個包含復(fù)雜元素的列表中提取指定屬性,去重并返回新列表。 該方法接收兩個參數(shù):原始列表 `rawList` 和用于提取指定屬性的函數(shù)接口 `mapLogic`。該方法使用 Java 8 的 Stream API 處理原始列表,首先使用 `map()` 方法對每個元素進行屬性提取,然后使用 `distinct()` 方法去重,最后使用 `collect()` 方法將 Stream 轉(zhuǎn)換為列表并返回。
測試
//判斷里面是否有重復(fù)
DistinctUtil<User> util = new DistinctUtil();
List<User> users = Arrays.asList(
User.builder().name("魯班七號").age(10).build(),
User.builder().name("魯班七號").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的時候,一定要加泛型,不然User::getName的使用會有問題,會報一個Non-static method cannot be referenced from a static context的錯誤。
對應(yīng)的,可以再封裝兩個判斷是否重復(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)在還有個問題,每次用這個工具類,還得先new出一個對象來,有點麻煩。
我之前試過,方法如果加了static,就不能用T了。其實這并不是說靜態(tài)方法不能用類的泛型參數(shù),而是如果你要用類的泛型參數(shù),這個方法也得是泛型方法。
舉個栗子:
public static <T> List<T> distinctList(List<T> rawList) {
return rawList.stream().map(item -> item).distinct().collect(Collectors.toList());
}搞定了。

本文主要就是做一個記錄,我是jdk1.7的忠實粉絲,lamda表達式用起來還是有點磕磕絆絆,后面要加油了。
總結(jié)
到此這篇關(guān)于java實用小技巧之判斷l(xiāng)ist是否有重復(fù)項的文章就介紹到這了,更多相關(guān)java判斷l(xiāng)ist有重復(fù)項內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot做代理分發(fā)服務(wù)+代理鑒權(quán)的實現(xiàn)過程
這篇文章主要介紹了springboot做代理分發(fā)服務(wù)+代理鑒權(quán)的實現(xiàn)過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
Mybatis generator修改Mapper.java文件實現(xiàn)詳解
這篇文章主要為大家介紹了Mybatis generator修改Mapper.java文件實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09
springBoot?@Scheduled實現(xiàn)多個任務(wù)同時開始執(zhí)行
這篇文章主要介紹了springBoot?@Scheduled實現(xiàn)多個任務(wù)同時開始執(zhí)行,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
mybatis寫xml時數(shù)字類型千萬別用 !=‘‘(不為空串)進行判斷的示例詳解
這篇文章主要介紹了mybatis寫xml時數(shù)字類型千萬別用 !=‘‘(不為空串)進行判斷的示例詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09
springboot整合shiro登錄失敗次數(shù)限制功能的實現(xiàn)代碼
這篇文章主要介紹了springboot整合shiro-登錄失敗次數(shù)限制功能,實現(xiàn)此功能如果是防止壞人多次嘗試,破解密碼的情況,所以要限制用戶登錄嘗試次數(shù),需要的朋友可以參考下2018-09-09
metershpere實現(xiàn)調(diào)用自定義jar包中的方法
在MeterSphere接口測試中,面對多層循環(huán)邏輯和邏輯判斷等復(fù)雜情況,直接編寫測試用例往往顯得混亂不便,本文介紹了一個簡化這一過程的方法:首先使用IDEA創(chuàng)建Maven工程,編寫所需邏輯并生成jar包;然后在MeterSphere中上傳此jar包2024-10-10

