代码编织梦想

问题

如题,本次在项目中编写RBAC权限,构建动态路由菜单的时候,使用了list.contains(对象)但是未重写对象的equals方法,导致已存在对象仍被判为未存在重复添加!导致前端显示的菜单会出现重复!!!(小坑买打雷,哈哈哈)

解决

对目标类重写equals方法;

上代码

controller

/***
* 获取动态路由
*/
@GetMapping("getMenusRouters")
    public AjaxResult getRoutersTwo()
    {
    LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
    // 用户信息
    SysUser user = loginUser.getUser();

    List<SysMenu> menus = menuService.selectMenuListForRouter(new SysMenu(), user.getUserId());
    return AjaxResult.success(menuService.builderMenusRouters(menus));
}

实现类

/**
* 查询系统菜单列表
*
* @param menu 菜单信息
* @return 菜单列表
*/
@Override
    public List<SysMenu> selectMenuListForRouter(SysMenu menu, Long userId) {
    List<SysMenu> menuList = null;
    List<SysMenu> menus = new ArrayList<>();
    // 非管理员查询其关联的菜单
    menuList = menuMapper.selectMenuTreeByUserId(userId);
    // 分组菜单,全选的包含其父菜单,半选的未包含
    Map<Long, List<SysMenu>> listMap = menuList.stream().collect(Collectors.groupingBy(SysMenu::getParentId));
    menus.addAll(menuList);
    // 找出半选的父菜单加入list返回
    listMap.forEach((k, v) -> {
        if (k == 0) {
        } else {
            SysMenu sysMenu = menuMapper.selectMenuById(k);
            // !!! 就是这里了  !!!
            if (!menus.contains(sysMenu)) {
                menus.add(sysMenu);
            }
        }
    });
    // 排序
    if (menus != null && menus.size() > 0) {
        List<SysMenu> sysMenus = menus.stream().sorted(Comparator.comparingLong(SysMenu::getParentId).thenComparing(SysMenu::getOrderNum)).collect(Collectors.toList());
        return sysMenus;
    }
    return null;
}

对SysMenu重写equals即可。

@EqualsAndHashCode
public class SysMenu extends BaseEntity{}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42055104/article/details/129602425

list.contains(object object)和equals方法_kyogoshin的博客-爱代码爱编程

contains方法内部循环列表 查看o是否equals 列表中的各个元素,实际是使用对象的equals方法 public boolean equals(Object obj) {         return (this == obj); } equals使用的是 == ,需要引用相等. 如果是需要值相等,需要重写对象的equals方法

list.contains(object object)方法,比较对象是否相同_dodod2012的博客-爱代码爱编程_listcontains方法比较对象

原文地址:https://blog.csdn.net/growing_tree/article/details/46622579 使用List.contains(Object object)方法判断ArrayList是否包含一个元素对象(针对于对象的属性值相同,但对象地址不同的情况),如果没有重写List<E>的元素对象Object中的equ

list的contains()方法详解以及重写equals()方法时需要注意的地方-爱代码爱编程

文章摘抄自http://blog.csdn.net/javazejian/article/details/51348320 我们先来看看contains方法内部实现 @Override public boolean co

list 判断对象属性是否存在,重写equals()方法_涛哥是个大帅比的博客-爱代码爱编程

实体类User import java.util.Objects; public class User { private String userName; private String userCode; public User() { } public User(String userName, String use

Java学习之List重写equals方法-爱代码爱编程

 List 还提供了boolean contains(Object o)方法来判断List是否包含某个指定元素。此外,int indexOf(Object o)方法可以返回某个元素的索引,如果元素不存在,就返回-1。  List中的元素是引用类型,需要比较时,必须重写对应类中equals方法 因此,我们总结一下equals()方法的正确编写方法: 先

List中的contains()方法,判断list中对象是否相等,需要重写对象的equals()方法-爱代码爱编程

实体类重写equals()方法 package com.rpmc.demo.protoEntity.tsrm.section; import java.util.Objects; public class TsrSection { private int lineId;//线路id private int sectionId;//区

Java中List.contains()方法比较的是地址而不是值-爱代码爱编程

本文转载自List.contains(Object object)方法 使用List.contains(Object object)方法判断ArrayList是否包含一个元素对象(针对于对象的属性值相同,但对象地址不同的情况),如果没有重写List<E>的元素对象Object中的equals方法,默认如下: @Override publi

java 重写 contains_JAVA中list.contains()方法,要重写equals(),hashcode()方法-爱代码爱编程

object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true; 注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。如下: (1)当

java List实体类的比较,contains和equals,无需重写点击即用-爱代码爱编程

业务需求,有时候我们会需要比较当前的实体类的值是否和数据库查出来的某一条数据相同。 最初我以为直接用List.contains就可以比较,但是!俺们实际操作一下。 // 介是实体类 public class Employee { private Integer id; private String name; private String g

Java中List使用contains比较自定义对象是否相同-爱代码爱编程

在List.contains()方法比较list对象中是否已包含某个对象实例,需要重写这个对象的equals对象,用对象中某个(或几个)属性作为判断对象是否一致的条件(contains方法依据Object的equals方法来判断是否包含某一属性),比如下面的例子就是使用了User对象中重写了equals方法,并使用身份证号属性相同来判断User对象是一样。

集合List和Map——重写equals和hashCode方法(集合元素是类的对象)-爱代码爱编程

本文的重点是 List重写equals方法来使用contains与indexOf方法Map,相同内容的不同对象,应该返回相同的value值 解决了当List集合里面的元素是类的对象,而不是String,Integer等类型时,怎么使用contains方法和indexOf方法 解决了map的key值是类的对象时,怎么用具有相同内容的不同对象,获

Java List的contains()方法详解以及重写equals()方法时需要注意的地方-爱代码爱编程

contains方法内部实现 @Override public boolean contains(Object o) { return indexOf(o) != -1; indexof方法内部实现 @Override public int indexOf(Object o) { E[] a = t

源码解析list.contains()方法,比较集合中的是存在某对象-爱代码爱编程

直接上代码: 如图;这个集合中有世纪证券这个对象,那么我们拿这个test对象去比较,看是否在集合中存在,期望返回true,但是返回了false, 为什么会这样,我们跟踪list.contains的源码去看看,因为这里是list的引用指向了arrayList对象,所以我们看arrayList的contains源码, 它直接调用内部的inde

list.contains()方法判断是否包含自定义对象_鹏神丶明月天的博客-爱代码爱编程

如果一个list中存入了许多user对象,如何使用contains方法判断该list是否包含某个对象呢? 首先list.contains()方法判断是否包含,需要在user中复写equals()方法 复写方法时需要确认如何认定user 比如俩个user的name属性相同,不管age和birthday是否相同,都认为这两个user是同一个user,那么

pthread-爱代码爱编程

问题描述: 从业务抽离出来大概是这样:大概是如下的场景,这个程序跑了40分钟后,pthread_create返回11,创建失败。 int i=0; void play_handle(){     i=0;     for(;i<5;i++){         sleep(1);         printf("i=%d\n",i);