java實(shí)用小技巧之判斷l(xiāng)ist是否有重復(fù)項(xiàng)簡單例子
在項(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)文章
Springboot整合Spring Cloud Kubernetes讀取ConfigMap支持自動(dòng)刷新配置的教程
這篇文章主要介紹了Springboot整合Spring Cloud Kubernetes讀取ConfigMap支持自動(dòng)刷新配置,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09基于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-02Java實(shí)現(xiàn)Excel文件轉(zhuǎn)PDF(無水印無限制)
這篇文章主要為大家詳細(xì)介紹了如何利用Java語言實(shí)現(xiàn)Excel文件轉(zhuǎn)PDF的效果,并可以無水印、無限制。文中的示例代碼講解詳細(xì),需要的可以參考一下2022-06-06Java中的system.getProperty()的作用及使用方法
System.getProperty()?方法用于獲取系統(tǒng)屬性的值,該方法接受一個(gè)字符串參數(shù),表示要獲取的系統(tǒng)屬性的名稱,返回值為字符串類型,表示該屬性的值,接下來通過本文給大家介紹Java中的system.getProperty()的作用及使用方法,感興趣的朋友跟隨小編一起看看吧2023-05-05Java中String、StringBuffer、StringBuilder的區(qū)別介紹
這篇文章主要介紹了Java中String、StringBuffer、StringBuilder的區(qū)別介紹,本文講解了可變與不可變、是否多線程安全、gBuilder與StringBuffer共同點(diǎn)等內(nèi)容,需要的朋友可以參考下2015-06-06