函数式编程
概述为什么要学?
1.大数量下处理集合效率高 2.代码可读性高 3.消灭嵌套地狱
概念面向对象思想需要关注用什么对象完成什么事情,而函数式编程思想就类似于我们数学中的函数,它主要是关注对数据进行了什么操作
优点
代码简洁,开发快速
接近自然语言,易于理解
易于并发编程
Lambda表达式Lambda 是 JDK8 中一个语法糖,可以看成是一种语法糖,它可以对某些匿名内部类的写法进行简化,它是函数式编程思想的一个重要体现,让我们不用关注什么是对象,而是关注我们对数据进行了什么操作
基本格式1(参数列表) -> {代码}
我们在创建线程并启动时可以使用匿名内部类的写法:
123456new Thread(new Runnable() { @Override public void run() { System.out.println("小吉崽汁"); }}).start();
可以使用Lambda的格式对其进行修改:
123new Thread(() -> ...
Java Random.nextInt()
Java Random 方法类似于 Js 的 Math.random() 方法都是生成随机数,只是具体的用法有一点差别,但是结果都是差不多
1int size = new Random().nextInt(5);
上面的方法生成的是 [0,5) 区间的随机数,注意是左闭右开,这里只是举了一个 int 类型的例子,其他类型也是如此
JUC 并发编程(二)
原子类基本类型原子类123456class MyNumber { AtomicInteger counter = new AtomicInteger(); public void addPlus() { counter.getAndIncrement(); }}
12345678910111213141516171819202122MyNumber myNumber = new MyNumber();CountDownLatch countDownLatch = new CountDownLatch(SIZE);for (int i = 1; i <= 50; i++) { new Thread(() -> { try { for (int j = 1; j <= 1000; j++) { myNumber.addPlus(); } ...
Aplayer
碎碎念最近hexo-tag-aplayer不知道为什么挂掉了,作者大大还没有优化,于是我就在网上找了找资料,重新配置了一下全局吸低的aplayer
魔改步骤
在 _config.butterfly 中引入如下代码
12- <div id="aplayer"></div>- <script defer src="/js/aplayer.js"></script>
在 source/js/ 文件夹下创建 aplayer.js
1234567891011121314const ap = new APlayer({ container: document.getElementById('aplayer'), fixed: true, lrcType: 3, audio: [ { name: '夏天的风', artist: '火羊瞌睡了', url: 'https:// ...
Mybatis or 用法
Mybatis or关键字用法
这里有一个BUG,if test typeIds != null 后面不能跟and,Mybatis if 标签会自动帮我们添加and,需要注意一下
阿里云 OSS 跨域配置
来源的话一般是用自己的域名,我这里图省事就配置 * 了,允许任何来源,可以根据自己的需求配置
JRebel and XRebel
前沿我在用 IDEA 的时候会用一些 IDEA 自带的插件,这样可以帮助我快速开发,JRebel and XRebel 就是一款很不错的插件,缺点就是要收费不过你也可以自己破解,这里博主还是要呼吁大家如果有能力的话还是要支持一下正版。JRebel 主要是一款很不错的热部署插件,尤其在编写项目中有时候重起项目是一款很麻烦的一件事情,JRebel 就做到了可以帮我们自动重新加载修改过的类,不管是前端还是后端都非常好用
正文对于大部分来说应该是不想花钱的,要破解的也非常简单,首先去 在线生成UUIDS网站生成一个UUIDS,一般不会重复,如果重复可以多试几遍。然后再去IDEA下载JRebel插件配置JRebel插件
选择 Team URL 第一行填写 https://jrebel.qekang.com/{UUIDS},邮件的话随便填就行,这样就可以顺利破解成功了!不过这个方法到目前为止,也就是这篇文章发表的日期,只能破解到 2022.4.1, 我的 IDEA 版本是 2022.2.2 前版本的 JRebel 已经更新到了 2022.4.2,如果是用破解方法的小伙伴千万不要更新,2022. ...
Bootstrape 弹出层父页面获取子页面的数据
碎碎念Bootstrape + Thymeleaf 实现跳转页面传值的时候真的是非常麻烦,GET请求还好利用 @PathVariable 注解可以在路径上获取,但是 POST 的话就比较麻烦了况且如何要获取对象的话也不可能把所有字段都列在路径上
解决办法
我们可以在 $.modal.open 绑定一个回调方法,这个open是自己封装的底层就是 layer.open
找到弹出层的 iframe,然后获取弹出层的返回值,当然这个看你自己的代码,我的方法叫 changeChecked
1window["layui-layer-iframe" + index].changeChecked();
Property referenced in indexed property path 't1[]' is neither an array nor a List nor a Map; returned value was []]
碎碎念Bootstrape + Thymeleaf 真的是太太太太太麻烦了,对于用惯了 Vue 的我来说,真的是嫌弃的一批,这不,今天又遇到了一个 BUG,今天在编写前台的时候我本身打算的是传一个数组对象到后台,可想而至后台报错了🤮。For Input String" " 大致意思就是说我的类型不对呗,只好改了类型,后台改成了 String 接收,但是又报错了,这次该诉我既不是 list 也不是 map 所以不可以😷
解决办法上网搜了一下,发现这是 ajax 发送请求的问题,加上 traditional: true 即可解决问题
Mybatis 分页插件 BUG
前沿今天遇到了一个 Mybatis 分页插件 pageHelper 的 BUG,简单来说就是我的查询总数和我的 pageSize 总是一样,这让我很苦恼
解决办法上网查了很多资料,终于找到了解决办法。功夫不负有心人呐,首先我想的是自己手写一个分页方法,但是这个方法被我后面给否决了,原因就是太麻烦了,程序员真的是能偷懒就偷懒,哈哈哈哈哈哈哈,后面我就想到自己收到给它 set 一个 total 进去类似于下面的这种
但是后来我发现这种办法真是太蠢了,这样只是看上去做到了分页,把我想要的数据查出来然后再set进来,理论上是没问题,但是当数据量很大的时候,几十万几百万的情况下查询真的是太慢了!!!
后面我查看了一下 pageHelper 的源码发现 startPage 开启分页方法只对后面的sql查询起作用,所以我们只需要把查询出来的 list 记录下来,然后再跟最终的 list 比较替换一下就好,具体的方法如下
大功告成,不仅实现了分页,而且查询速度效率也很快