java实用小技巧:判断list是否有重复项

简介: 在项目中经常会遇到这样的场景,就是一个list,根据某种规则,我要去判断里面是不是有重复的项。难度不高,但有点烦,所以专门开一篇文章来记录一下,争取弄一个相对简洁的写法。

在项目中经常会遇到这样的场景,就是一个list,根据某种规则,我要去判断里面是不是有重复的项。

难度不高,但有点烦,所以专门开一篇文章来记录一下,争取弄一个相对简洁的写法。

先看一个简单的例子:

//有一个list,里面是long类型的数字集合
List<Long> numbers = new ArrayList<>();
numbers.add(1L);
numbers.add(2L);
numbers.add(2L);
numbers.add(3L);
numbers.add(4L);
numbers.add(5L);

//判断里面是否有重复
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 类型的参数 rawList,返回一个经过去重处理的 List。 具体来说,该方法使用 Java 8 中的 Stream API 来对 rawList 进行操作。

首先,使用 stream()rawList 转换为一个 Stream。然后,我们用map方法对每个元素进行了一个映射,就是把元素本身映射为元素本身,这一步看似无意义,但其实它是为了强制把 List 转化为 Stream。

接下来,在数据流中使用 distinct() 去重,最后用 collect(Collectors.toList()) 方法把处理后的数据流转换为 List 类型并返回。

因为numbers是有重复元素的,所以结果是false。

进一步优化,如果的复杂类型怎么办呢?

比如有一个User类:

@Data
@Builder
public class User {
    String name;
    Integer age;
}

我要根据姓名是否有重复来判断,就得修改一下逻辑。

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());
}

这个方法可以用来从一个包含复杂元素的列表中提取指定属性,去重并返回新列表。 该方法接收两个参数:原始列表 rawList 和用于提取指定属性的函数接口 mapLogic。该方法使用 Java 8 的 Stream API 处理原始列表,首先使用 map() 方法对每个元素进行属性提取,然后使用 distinct() 方法去重,最后使用 collect() 方法将 Stream 转换为列表并返回。

测试

//判断里面是否有重复
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的错误。

对应的,可以再封装两个判断是否重复的方法:

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();
}

现在还有个问题,每次用这个工具类,还得先new出一个对象来,有点麻烦。

我之前试过,方法如果加了static,就不能用T了。其实这并不是说静态方法不能用类的泛型参数,而是如果你要用类的泛型参数,这个方法也得是泛型方法。

举个栗子:

public static <T>  List<T> distinctList(List<T> rawList) {
    return rawList.stream().map(item -> item).distinct().collect(Collectors.toList());
}

搞定了。

本文主要就是做一个记录,我是jdk1.7的忠实粉丝,lamda表达式用起来还是有点磕磕绊绊,后面要加油了。

相关文章
|
7月前
|
存储 安全 Java
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
|
7月前
|
Java
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
|
7月前
|
存储 Java
Java学习笔记 List集合的定义、集合的遍历、迭代器的使用
Java学习笔记 List集合的定义、集合的遍历、迭代器的使用
108 4
|
5月前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
104 5
|
5月前
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
102 3
|
5月前
|
Java 程序员
Java|List.subList 踩坑小记
不应该仅凭印象和猜测,就开始使用一个方法,至少花一分钟认真读完它的官方注释文档。
56 1
|
7月前
|
Java 数据库
成功解决:java.sql.SQLSyntaxErrorException: Unknown column ‘origin_name‘ in ‘field list‘
这篇文章讲述了作者在使用SpringBoot和Mybatis-plus时遇到的一个数据库字段映射问题,即SQLSyntaxErrorException错误,原因是实体类字段和数据库字段不匹配。文章提供了两种解决方法:一是关闭自动驼峰命名转换配置,二是修改数据库字段以匹配实体类字段,最终成功解决了问题。
成功解决:java.sql.SQLSyntaxErrorException: Unknown column ‘origin_name‘ in ‘field list‘
|
7月前
|
存储 安全 Java
java集合框架复习----(2)List
这篇文章是关于Java集合框架中List集合的详细复习,包括List的特点、常用方法、迭代器的使用,以及ArrayList、Vector和LinkedList三种实现类的比较和泛型在Java中的使用示例。
java集合框架复习----(2)List
|
7月前
|
存储 安全 Java
java集合框架复习----(4)Map、List、set
这篇文章是Java集合框架的复习总结,重点介绍了Map集合的特点和HashMap的使用,以及Collections工具类的使用示例,同时回顾了List、Set和Map集合的概念和特点,以及Collection工具类的作用。
java集合框架复习----(4)Map、List、set
|
8月前
|
Java API 存储
Java如何对List进行排序?
【7月更文挑战第26天】
340 9
Java如何对List进行排序?

热门文章

最新文章