箭头函数和解构赋值混用
一个人的礼貌是一面照出他的肖像的镜子。——歌德 我们在前端对数组进行操作时,如果使用map函数,编写的箭头函数其实也是可以解构的 例如经常遇到的,将一个对象数组中的属性,更换另一个属性名,用于给vue组件传值 写法如下: 1[{name:'achao',id:1},{name:'阿超',id:2}].map(({name:username,id:userId})=>({username,userId})) 注意的是,结构赋值需要打括号,下方再举一个例子,这里用flatMap收集全部的name和id直接变为一个数组 1[{name:'achao',id:1},{name:'阿超',id:2}].flatMap(({name,id})=>[name,id])
动态参数+reduce累加stream
通向面包的小路蜿蜒于劳动的沼泽之中,通向衣裳的小路从一块无花的土地中穿过,无论是通向面包的路还是通向衣裳的路,都是一段艰辛的历程。 ——福斯 今天有朋友问我,stream中如果要将一个User类中的username和id收集起来变成两个list怎么写,我说可以使用peek函数 1234567@Data@AllArgsConstructorstatic class User { private Long id; private Long groupId; private String username;} 就像这样: 1234567891011 // 用户列表 List<User> userList = Stream.iterate(1L, i -> ++i).map(id -> new User(id, 999L, Faker.instance().name().username())).limit(10).collect(Collectors.toList()); // 要收集起来...
ThreadLocal子线程共享
世人缺乏的是毅力,而非气力。——雨果 昨天聊了ThreadLocal可以用作单个线程中变量共享 其底层实现其实就是个Map,用线程作为key,不信可以看这部分源码: 123456789101112131415161718192021/** * Returns the value in the current thread's copy of this * thread-local variable. If the variable has no value for the * current thread, it is first initialized to the value returned * by an invocation of the {@link #initialValue} method. * * @return the current thread's value of this thread-local */public T get() { Thread t = Thread.currentThr...
ThreadLocal
只有利害关系和出众的才干,才能帮你出起主意来,才认真细到,眼光透彻。——巴尔扎克 我们在web开发中经常遇到在一个线程中需要共享变量 这里就可以使用ThreadLocal去完成 例如我们用户发起请求,我们在过滤器等将用户信息存储在ThreadLocal中,这样在代码中获取用户信息就相对容易 写法如下: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748import cn.hutool.core.lang.Opt;/** * 用户工具类 * * @author <achao1441470436@gmail.com> * @since 2021/8/25 12:10 */public class UserUtils { private static final ThreadLocal<UserDetail> USER_THREAD = new ThreadLocal<>(); /** ...
@SafeVarargs
不管怎样的事情,都请安静地愉快吧!这是人生。我们要依样地接受人生,勇敢地大胆地,而且永远地微笑着——卢森堡 前两天给mybatis-plus贡献了代码 https://gitee.com/baomidou/mybatis-plus/pulls/192 这里用到了一个注解SafeVarargs 我们在使用动态参数+泛型的时候,会提示来自形参化 vararg 类型的可能的堆污染 例如: 我们这里加上@SafeVarargs后发现它只能加在final或者static修饰的方法上: 不加的话会编译错误 再放几个例子吧: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849package com.ruben.simplescaffold;import org.junit.jupiter.api.Test;import java.util.Arrays;import java.util.List;import java.util.Optional;/** ...
逻辑删除与联合索引冲突处理
早知今日读书是,悔作从前任侠非。——李欣 今天发现联合唯一索引和逻辑删除冲突了,导致我这边已删除的数据还具有唯一索引的约束 本来一开始是考虑要不要在删除前手动将数据清空一下,但这样感觉并不优雅 然后今天跟朋友探讨了下,决定使用datetime作为逻辑删除字段的类型,如果未删除,则字段为魔法值的固定时间,已删除,则设为删除时的时间 使用Mybatis-plus能够优雅实现: 将逻辑删除字段如下配置即可 12345/** * 逻辑删除 已删除为删除时间,未删除为null */@TableLogic(delval = "NOW()", value = "'2001-01-01 00:00:00'")private LocalDateTime delFlag; 如果不是用注解,也可以配置全局,全局配置的方法我之前写过一篇博客,只要把对应的删除值修改一下即可 然后对应的数据库联合唯一索引,将其关联上 最后效果也是很棒: 可以看到查询自动带上了设置的日期 而我们进行删除时也成功设为NOW() 这里对应的代码实现com.ba...
lombok建造者模式支持父类
精力充沛的青春,是不怎么容易灭亡的。——卡罗萨 使用@SuperBuilder注解代替原本的@Builder就可以了 如果对建造者模式不太了解的,可以看我以往写的博客: https://VampireAchao.github.io/2020/11/08/%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F/ 这里做个对比,加之前: 加之后: 可以看到子类开始的建造者模式成功访问到父类属性,不过最终获取到的还是父类 如果想要最终获取到的还是子类,可以在父类也使用@SuperBuilder 不过父类的父类也要有@SuperBuilder
jq根据屏幕高度设置元素高度
没有哪一个聪明人会否定痛苦与忧愁的锻炼价值——赫胥黎 很简单一行代码: 1$('#ruben').css('height', $(window).height()); 这里$(window).height()获取了屏幕高度 然后用css函数去设置style
状态模式
顽强的毅力可以征服世界上任何一座高峰。——狄更斯 我们在实现审核业务的时候,可能在没使用状态模式的时候,使用if else或者switch case进行操作 ruben说:我不能针对不同的状态写多个后端接口吗? achao说:那你前端还是要使用if else去根据不同的状态调用不同的接口啊 我这里模拟一个简单的审核,真实项目中的业务将比这复杂 我们在用户提交审核后,状态应该是待审核 在待审核时执行操作,如果用户提交的内容为空,则将状态更改为审核未通过 在待审核时执行操作,如果用户提交的内容不为空,则将状态更改为审核已通过 在审核未通过时,如果用户再次执行操作,提示重新提交审核 在审核已通过时,如果用户再次执行操作,提示审核已通过 这里我们采用状态模式实现: 首先定义一个状态接口: 12345678910111213141516171819202122232425262728293031package com.ruben.state.example;import java.util.Map;/** * 审核状态公共接口 * * @author <achao14414704...
策略模式
只有永远躺在泥坑里的人,才不会再掉进坑里。——黑格尔 今天聊聊策略模式 一个导航程序,提供多种出行方式的导航策略 例如最开始就两种策略如步行和公路出行,我们将它写到一个类中 慢慢的,新增了公共交通,步行和公路出行中的逻辑越来越多,越来越复杂 如果此时不进行抽取,则会导致一个类中的代码行数过多,维护起来困难,如果是团队开发,代码冲突不断 抽取后能解决此问题,并且一些公共逻辑抽取出来能减少重复代码 因此我们将所有策略抽取出一个公共接口: 123456789101112131415161718192021package com.ruben.strategies.exapmle;import java.util.List;/** * 路线规划策略接口 * * @author <achao1441470436@gmail.com> * @since 2021/10/16 19:10 */public interface RouteStrategy { /** * 路线规划 * * @param start 起点 * @para...
