最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(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ì)遇到這樣的場(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)文章

最新評(píng)論

徐水县| 章丘市| 桃源县| 陕西省| 清涧县| 石台县| 黑山县| 杂多县| 阿尔山市| 通化县| 阜阳市| 黑山县| 朔州市| 河东区| 蛟河市| 互助| 沙湾县| 平武县| 林甸县| 临泉县| 孝昌县| 唐海县| 安陆市| 巴塘县| 香河县| 曲阳县| 信阳市| 和田县| 云霄县| 木里| 视频| 山东省| 会昌县| 思茅市| 灵石县| 藁城市| 呼图壁县| 桦川县| 全州县| 东阿县| 鲜城|