Collectors.toMap空指针问题
社会上崇敬名人,于是以为名人的话就是名言,却忘记了他所以得名是那一种学问和事业。 —— 鲁迅 对于Collectors.toMap,我们使用时如果value为空,则会抛出空指针,因为底层调用的Map.merge函数 如果我们想避免该问题,就可以使用collect去处理,例如我给hutool提交的这个PR一样 原先: 1StreamUtil.of(collection, isParallel).collect(Collectors.toMap(key, value, (l, r) -> l)); 现在: 1StreamUtil.of(collection, isParallel).collect(HashMap::new, (HashMap<K, V> m, E v) -> m.put(key.apply(v), value.apply(v)), HashMap::putAll); 完整函数: 12345678910111213141516/** * @param collection 需要转化的集合 * @param key E类型转...
命令模式
向没有开辟的领域进军,才能创造新天地。——[美]李政道 命令模式的最大优势为将应用分层处理,避免各层耦合 这里举个例子 在市中心逛了很久的街后, 你找到了一家不错的餐厅, 坐在了临窗的座位上。 一名友善的服务员走近你, 迅速记下你点的食物, 写在一张纸上。 服务员来到厨房, 把订单贴在墙上。 过了一段时间, 厨师拿到了订单, 他根据订单来准备食物。 厨师将做好的食物和订单一起放在托盘上。 服务员看到托盘后对订单进行检查, 确保所有食物都是你要的, 然后将食物放到了你的桌上。 那张纸就是一个命令, 它在厨师开始烹饪前一直位于队列中。 命令中包含与烹饪这些食物相关的所有信息。 厨师能够根据它马上开始烹饪, 而无需跑来直接和你确认订单详情。 我们如果不使用命令模式,写出来的代码就如下: 1234567891011121314private static void withoutCommandMode() throws InterruptedException { // 在市中心逛了很久的街后, 你找到了一家不错的餐厅, 坐在了临窗的座位上。 // 一名友善...
Promise
人活在世,不过一场美丽的寄居。——简嫃 在前端开发中经常会使用异步方法 这里介绍Promise函数 定义方式: 12345// Promise内部构造参数为一个闭包,闭包中传入你想要异步处理的逻辑new Promise((resolve,reject)=>{ // 这里resolve表示正常处理异步逻辑后传送回调,reject则是异常逻辑或错误逻辑时执行,当异步方法中抛出异常,会自动调用reject,这里也可以手动调用 resolve(1)}) 然后定义完了,我们就可以开始调用 调用写法如下: 12345678new Promise((resolve,reject)=>{ // 假设我这里异步方法处理完后得到的结果为1,我就传入一个1 resolve(1)}).then(res=>{ // 然后异步方法执行完了,我再对结果进行异步处理,让得到的1再加一个1 console.log(res+1)}) 使用then可以执行异步方法后续处理,将异步方法的回调的结果作...
mysql重置自增主键坑
商人的兴趣就在那些能找到财富的地方。——埃伯克 今天重置mysql自增主键时遇到个坑,明明sql执行了 1ALTER TABLE table_name AUTO_INCREMENT= 1; 但还是修改失败了 后来发现原来是因为当前表最大id比我设置的自增id大导致的 而且这种情况还不报错,提示sql正常执行,就挺坑的 最后把表内数据调整了,成功重置自增id 可以通过 1SHOW TABLE STATUS WHERE NAME = 'user'; 查看表状态
uniapp播放音频
人们不太看重自己的力量——这就是他们软弱的原因。——高尔基 播放音频的代码很简单: 123const innerAudioContext = uni.createInnerAudioContext(); innerAudioContext.src = '/img/oss/picGo/kuangstudy9664a946-42a5-4111-80e7-65e735932ef7.wav'; innerAudioContext.play(); 官方文档: https://uniapp.dcloud.io/api/media/audio-context 除了播放、暂停、停止等也都能实现 完整代码: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980<template> <view class=...
nvue中tap事件取消冒泡
青春是一种持续的陶醉,是理智的狂热。——拉罗什富科 nvue中@tap.stop阻止冒泡失效了 代码如下: 1<view @tap="parentEvent"><view @tap.stop="childEvent">触发触发</view></view> 大概有两种方案,第一种是改事件,改为@touchend事件 1<view @tap="parentEvent"><view @touchend="childEvent">触发触发</view></view> 不过还有另一种方式 1234567parentEvent(e) { console.log('parentEvent');},childEvent(e) { console.log('childEvent'); e.stopPropagation();}
mysql连接数满了怎么调大
人生应该如蜡烛一样,从顶燃到底,一直都是光明。——萧楚女 今天链接数据库发现提示too many connections 于是临时把mysql连接数调大了一点 查看参数sql: 1show variables; 设置连接数: 1set GLOBAL max_connections=99999;
TransmittableThreadLocal坑
巨大建筑,总是由一木一石叠起来,我们何妨做做这一木一石呢?我时常做些零碎事,就是为此。——鲁迅 今天遇到一个坑,在使用TransimittableThreadLocal(以下简称TTL)时,用了一会儿,在子线程中突然获取不到TTL在主线程中存储的变量了 翻了翻官方项目地址,发现我这里使用的CompletableFuture没有指定线程池,后来指定使用TtlExecutors包装的线程池就可以了 具体实现如下: 修改前: 1234@SafeVarargs public static <T extends Model<T>, I> CompletableFuture<Map<I, List<T>>> asyncGroupBy(T entity, Collection<I> paramList, SFunction<T, I> sFunction, Consumer<T>... peeks) { return CompletableFuture.supplyAs...
jquery根据属性选择
有信仰的人不会孤独。——阿列克谢耶维奇 分享一个jquery选择器的小技巧 我们可以通过自定义属性键值选中一个元素 例如如下元素: 1<div ruben="vampire">阿超</div> 然后我们通过ruben=vampire选中这个div 就可以如下写法: 1let vampire = $('div[ruben="vampire"]') 我们可以简单测试一下输出里面的内容 12345<div ruben="vampire">阿超</div><script type="text/javascript"> let vampire = $('div[ruben="vampire"]') console.log("vampire: ", vampire.text());</script> 效果
event
有信仰的人不会孤独。——阿列克谢耶维奇 vue官方文档有介绍$event 我们在开发中经常这么写来获取事件 1<div class="trigger-me" @click="triggerMe">点我触发</div> 方法: 123456methods: { triggerMe(e, name) { console.log('e: ', e); console.log('name: ', name); }} 然后调用一下 可以看到打印出了事件,如果我们需要传入其他参数,就可以使用$event了 1<div class="trigger-me" @click="triggerMe($event, 'ruben')">点我触发</div> 再次触发:
