首页 > 其他分享 >optional的正确使用

optional的正确使用

时间:2023-06-19 15:45:37浏览次数:32  
标签:return 正确 iterator userId userMap param key 使用 optional

 

loginResult.setTenant_id(Optional.ofNullable(user.getTenantCode()).orElse(""));
loginResult.setTenant_name(Optional.ofNullable(user.getTenantName()).orElse(""));

 

 /**
     * 真实操作踢下线的逻辑
     *
     * @param param
     * @param isStartKick
     * @return
     */
    private boolean trueOperation(LoginParam param, Boolean isStartKick) {
        if (Boolean.TRUE.equals(kickEnable)) {
            // 要踢下线的登录类型
            Set<String> kickTypes = Arrays.stream(kickLoginType.split(",")).collect(Collectors.toSet());
            // 如果当前登陆类型在踢下线的类型内
            if (kickTypes.contains(param.getLoginType())) {
                // 获取账户信息
                Account account = orgFetchService.getAccount(param.getAccountName(), AccountTypeEnum.Chancein.getValue().toString());
                if (null == account) {
                    return true;
                }
                String userId = String.valueOf(account.getUserId());
                // 因目前登录机制导致在线用户的查询只能是saas获取,或者通过修改auth服务的redis库变成0
                Map<String, List<OnlineUser>> userMap = onlineUserService.getOnlineUser().stream().filter(onlineUser -> StringUtils.isNotEmpty(onlineUser.getUserId()))
                        .collect(Collectors.groupingBy(OnlineUser::getUserId));
                // 登陆前踢出
                if (isStartKick && userMap.containsKey(userId)) {
                    return false;
                }
                // 登陆后踢出
                if (!isStartKick && userMap.containsKey(userId)) {
                    List<OnlineUser> onlineUsers = userMap.get(userId);
                    if (CollectionUtils.isNotEmpty(onlineUsers)) {
                        String key = compatibleSomeCondition(param, userId);
                        log.info("真实踢人业务存入redis的key名:{}", key);
                        // 获得当前用户的所有在线用户token信息
                        Set<String> tokenSet = onlineUsers.stream().map(OnlineUser::getTokenId).collect(Collectors.toSet());
                        //获取用户同端的token信息
                        String obj = cacheService.get(appGroup + ":" + userId);
                        CacheUser cacheUser = JSONObject.parseObject(obj, CacheUser.class);
                        if (cacheUser != null) {
                            List<LoginCache> loginCaches = Optional.ofNullable(cacheUser.getTokenMap().get(key))
                                    .orElse(new ArrayList<>());
                            // 只有同端在线用户确实存在时,才踢下线
                            Iterator<LoginCache> iterator = loginCaches.iterator();
                            boolean isChange = false;
                            while (iterator.hasNext()) {
                                LoginCache cache = iterator.next();
                                if (tokenSet.contains(cache.getToken())) {
                                    onlineUserService.kickOff(cache.getToken());
                                    iterator.remove();
                                    isChange = true;
                                }
                            }
                            updateUserTokenLink(loginCaches, cacheUser, key, isChange);
                        }
                    }
                    return true;
                }
            }
        }
        return true;
    }

 

标签:return,正确,iterator,userId,userMap,param,key,使用,optional
From: https://www.cnblogs.com/ZhangZiXue/p/17491287.html

相关文章

  • Java 运算符的使用
    Java运算符的使用1.算术运算符算术运算符包括:+,-,*,/,%,++,--,其中需要注意的是%,++,--;%取模运算也叫做取余,在Java中取余的规则:a%b=a-a/b*b++和--叫做自增运算即+1或-1++在前,先自加,后赋值++在后,先赋值,后自加(--运算与自增用法类似)2.算......
  • centos下nginx使用Let's Encrypt 申请免费 SSL 证书
    应用场景:想使用https,但是又不想花钱购买证书,也不是阿里和腾讯的可以免费申请以下是具体操作步骤:1.配置DNS记录在申请二级域名SSL证书之前,需要先将该二级域名解析到您的服务器IP地址。2.安装Certbot:Certbot是Let’sEncrypt官方提供的工具,可用于自动化SSL证书的获......
  • uniapp 中使用 navigator 跳转页面失败的问题
    uni.navigateTo用于页面跳转如:<navigatorurl="/pages/index/index"hover-class="navigator-hover"><buttontype="default">跳转</button></navigator>但是跳转页面失败,没有任何反应问题原因:url指定的页面,在pages.json中配置的是TabBar......
  • vi命令使用详解
    vi命令使用详解1.三种工作模式命令模式:通过命令对文件进行常规操作打开文件时进入命令模式(vi的入口)通过命令对文件进行常规操作,如定位、翻页、复制、粘贴、删除等在图形界面下通过鼠标或快捷键实现的的操作末行模式:执行保存、退出等操作若要退出vi返回控制台,需在末......
  • 前端如何防止用户使用F12看控制台
    先分享一下自己的搭的免费的chatGPT网站https://www.hangyejingling.cn/正文1、如果是VUE框架开发,在生产环境中。在入口文件APP.vue中添加如下代码,其他框架同理if(process.env.mode==='production'){ (functionnoDebugger(){ functiontestDebugger(){ vard=......
  • JavaScript中var、let、const的使用和区别
    var:var是声明变量的主要关键字,它的作用域是函数作用域函数作用域:意味着变量在函数内部声明是可见的,在函数外部声明是不可见的var声明的变量可以被重新声明和赋值,它可以在同一个作用于下多次声明同一个变量let:let的作用域是块作用域,块作用域可以是函数、条件判断等内部{......
  • Android-Kotlin-GET/SET 方法的使用
    上篇博客我们讲了kotlin的继承,今天接着往下讲解kotlin的get/set方法的使用。Student.ktpackagecn.kotlin.kotlin_oop04openclassPerson{openvarpersonName:String="我是父类的名字"}classStudent:Person(){/***name用private私有修饰,外界其他地方......
  • 通过API接口获取到数据后的使用方法以及储存方法
    API接口是许多应用程序和服务所必需的,可以将多个应用程序连接起来,允许不同应用程序之间的数据共享。在本文中,我们将探讨如何使用API接口获取数据,以及如何储存这些数据。1.使用API接口获取数据在获取API数据之前,我们需要确定API接口的URL和参数。该URL通常由API提供程序提供,并列......
  • 有关Docker安装、使用的部分相关问题
    @LastUpdate:2022/10/31注:如需在容器内使用显卡,需要安装好NVIDIA显卡驱动、cuda、nvidia-docker[方法见下文]。0.运行环境Docker引擎支持在x86_64(或amd64),armhf,andarm64上运行.1.卸载旧版本dockersudoapt-getremovedockerdocker-enginedocker.iocontainerd......
  • Java—枚举Enum中使用反射转换属性值
    关注微信公众号:CodingTechWork,一起学习进步。需求  在开发过程中,有时候需要需要根据各个枚举类中一个字段属性值转为另一个字段属性值,如根据code转为name的需求进行前端展示。本文总结一下如何通过反射简单巧妙的进行枚举属性值的互相映射。实践枚举类packagecom.test.self......