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

这篇具有很好参考价值的文章主要介绍了java实用小技巧:判断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());
}

搞定了。

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

本文主要就是做一个记录,我是jdk1.7的忠实粉丝,lamda表达式用起来还是有点磕磕绊绊,后面要加油了。 文章来源地址https://www.toymoban.com/news/detail-413415.html

到了这里,关于java实用小技巧:判断list是否有重复项的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 判断数组中是否有重复元素

    给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。 方法一:排序 在对数字从小到大排序之后,数组的重复元素一定出现在相邻位置中。因此,我们可以扫描已排序的数组,每次判断相邻的两个元素是否相等

    2024年02月16日
    浏览(51)
  • 判断电话号码是否重复-excel

    有时候重复的数据不需要或者很烦人,就需要采取措施,希望以下的方法能帮到你。 方法一: 1)针对第一个单元格输入等号,以及公式countif(查找记录数的范围,需要查找的单元格) 2)输入enter之后,然后鼠标变为黑色的加号后,往下拉自动填充,如下图所示。 方法二:先

    2024年02月03日
    浏览(58)
  • js判断一个数组中是否有重复的数组/ 一个数组中对象的某个属性值是否重复

    项目中往往会遇到对数组处理是否存在某个形同的值。或者对象中是否存在形同元素… 下列方法常用,但不限于。 一、普通数组数据 1.1对数组进行排序,对比上一个元素和下一个元素是否相等,若相等,则说明数组有重复值。 1.2:先将数组转换成字符串,再遍历数组,在字

    2024年02月09日
    浏览(71)
  • js判断对象数组中的元素是否存在重复

     1、使用  Array.some()  方法和自定义比较函数: 使用  Array.some()  方法遍历数组,对每个元素执行自定义的比较函数。比较函数使用  Array.findIndex()  方法来查找与当前元素相等且索引不同的元素,如果找到则表示存在重复元素。 2、使用  Set  数据结构: 使用  Set  数据结

    2024年02月13日
    浏览(65)
  • 前端算法题——给定一个整数数组,判断是否存在重复元素。

    题目可以理解为如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false。 这题一看就是 计数问题,题目中“如果存在一值在数组中出现至少两次”这句话就告诉我们记录每一个数字出现的次数就能解决问题了。  我们遍历数组时,

    2024年02月20日
    浏览(88)
  • pb:获取服务器时间、判断是否有重复数据

    /*----------------------------------------------------------------------- * 函数名称:datetime gf_getsysdate(string as_dbms) * 功能描述:取得服务器的的日期时间(DateTime)                       * 参数含义:as_dbms 所使用的数据库DBMS   * 返 回 值:datetime类型,系统日期 * 调用举例:ldt_today

    2024年02月06日
    浏览(46)
  • Python 判断列表里是否有重复元素的三种方法

    一、用 set 方法去重后与原列表长度比较 二、用 append 的方式把原列表中的元素添加到一个新列表,确保新列表里不存在重复的元素,然后比较两个列表 三、用 fromkeys 的方法创建一个字典,因为字典的键会自动去重,所以可以比较字典和原列表的长度,跟方法一很像

    2024年02月11日
    浏览(57)
  • python判断是否为list。转

    python判断是否为list ( - )浩( - )浩2019-08-31 09:05:39原创 判断是否为列表 格式:print(isinstance(变量,list)) 1 print(isinstance(slink,list)) 结果 :true说明为列表(list) 返回false说明不是列表(list) 获取类型 print(type(slink)) 执行结果为:class ‘list’说明为列表类型 isinstance和type区别 isinst

    2023年04月08日
    浏览(48)
  • 判断List、Map集合是否为空的方法

    1.判断List集合是否为空 1.1List集合已经完成初始化  这里的List集合已经完成了初始化操作,相当于是一个瓶子可以装水了,但是此时还没有水。  控制台输出:List is empty.  1.2List集合未完成初始化  这里的List集合,还没有进行初始化,相当于瓶子还不存在,用list.isEmpty()会产

    2024年02月15日
    浏览(62)
  • 使用js判断list中是否含有某个字符串,存在则删除,

    显示上图中使用了两种方式, 左边的是filter将不等于userCode的元素筛选出来组成一个新的list, 但是上面这个方法在 IE浏览器中不支持 , 所以改成了右边的方法,使用splice: splice传入两个参数,第一个参数是要删除的元素的索引位置,第二个是从这个索引往后删除几个;

    2024年01月24日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包