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

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

 更新時間:2023年10月24日 14:38:48   作者:剽悍一小兔  
這篇文章主要給大家介紹了關(guān)于java實用小技巧之判斷l(xiāng)ist是否有重復(fù)項的相關(guān)資料,在開發(fā)工作中我們有時需要去判斷List集合中是否含有重復(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)文章

最新評論

涪陵区| 镇雄县| 黎城县| 民乐县| 专栏| 阿拉善盟| 金门县| 罗平县| 定边县| 宜兴市| 龙里县| 盐津县| 莆田市| 江安县| 井研县| 开化县| 临夏市| 郑州市| 屯门区| 南昌市| 平利县| 葵青区| 襄垣县| 恩施市| 潞西市| 原平市| 太湖县| 万源市| 芒康县| 剑河县| 临潭县| 白沙| 峨山| 皋兰县| 文化| 泽普县| 曲水县| 罗甸县| 襄樊市| 晋江市| 洛川县|