Stream流(三)
前面我们说到collect方法用于收集元素,并转换成我们需要的格式。而collect方法的传参我们常用的不是自己实现Collector接口,而是使用Collectors类的方法,接下来就以例子说明一下Collectors类的常用方法
1、toListCollectors.toList用于将流元素收集成一个List集合,无需传参
12345678// 例子1,获取大于3的数字并放入List集合中List<Integer> collect = Stream.of(1, 2, 3, 4, 5, 6) .filter(i->{ return i > 3; }) .collect(Collectors.toList());System.out.println(collect);// 结果 [4, 5, 6]
1234567891011121314151617181920212223242526@Data@AllArgsConstructorclass User { private Integer id; ...
小问题记录
1、程序包org.apache.rocketmq.client.producer不存在引入mq的包,使用时idea编译一直报org.apache.rocketmq.client.producer不存在
的问题, 清除idea缓存重启都没用。
解决办法:打开电脑终端,cd到maven项目的目录下,执行如下命令:
1mvn idea:module
其他程序包不存在的错误也能试一试
Stream流(二)
Stream操作apiStream流常用的操作api如下:
方法
返回值
说明
filter
Stream
过滤数据
map
Stream
返回新的数据类型
flatMap
Stream
返回新的数据类型,并作扁平化处理
distinct
Stream
去重
sorted
Stream
排序
limit
Stream
获取前几条数据
skip
Stream
跳过前几条数据
forEach
void
遍历元素
reduce
Optional
数据汇总
collect
R
收集数据
count
long
数据个数统计
anyMatch
boolean
数据任意一个匹配
allMatch
boolean
数据全匹配
noneMatch
boolean
数据全不匹配
findFirst
Optional
获取第一个数据
findAny
Optional
获取任意一个数据
1、forEachforEach方法接受一个Consumer接口函数,会将每一个流元素交给函数进行处理。
1234567891011// 例子:for ...
Stream流(一)
Stream流是Java8的java.util.stream包的接口,可以很方面的对集合等进行操作
1、创建Stream流(1) 使用Stream自带的方法
Stream.of
Stream.of传入具体对象来生成Stream流,如下:
12// Stream.of(T... values)Stream<Integer> stream = Stream.of(1, 2, 3);
Stream.iterate
Stream.iterate生成的是一个无限流,需要传入两个参数,第一个是初始值,第二个参数是生成下一个值的方法,例子如下:
12// Stream.iterate(final T seed, final UnaryOperator<T> f)Stream<Integer> iterate = Stream.iterate(1, n -> n + 1);
例子中,初始值是1,会将初始值传入n -> n + 1中,得到下一个值是2。然后又把2传入到n -> n + 1中,得到3…如此反复。因此流中元素会是1,2,3…
所以该方 ...
LocalDate类
LocalDate类是JDK自带的java.time包一个表示日期的时间类,用于进行日期的比较、运算等非常方便,这里介绍一些简单的使用方法
1、创建LocalDate类123456// 今天的日期LocalDate today = LocalDate.now();// 使用年月日创建LocalDate localDate = LocalDate.of(2024, 1, 1);// 使用字符串创建LocalDate parseLocalDate = LocalDate.parse("2024-01-01");
2、Date和LocalDate的相互转化Date转化为LocalDate
123// Date转化为LocalDateDate todayDate = new Date();LocalDate todayLocalDate = todayDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate转化为Date
123// LocalDate转化为DateLocalDa ...
MySQL隐式转化引起的坑
1、bug复现bug出现的位置在一个根据id查询的代码,简化代码如下:
其中user.getId()是有值的,id是主键。按照道理来说,根据id查询,一般来说,要么就查询出一个数据,要么就查不出,不应该会在查询抛出错误。然而,这里却抛出了如下错误:
也就是说根据id查询,查出了3条记录!真是神奇
2、定位问题先打断点获取id看有没有问题
好像并没有什么问题,将id复制到数据库筛选看
这也没啥问题啊。
最后没办法,只能先把SQL打印出来看看
将SQL复制到数据库直接执行,发现居然查到了3行数据!
明明id都不一样,为什么能查出来?
弄来弄去,发现给id值加上引号就能正确查询
最后对比发现,数据库id的数据格式是varchar,而实体类的id定义成了Long
最后把Long类型的id改成String类型,问题解决
3、MySQL隐式转换3.1 隐式转换MySQL在执行操作SQL语句时,会自动的将一数据类型转换成另外的数据类型,这种情况就是隐式转换。
官网文档:
When an operator is used with operands of different typ ...
Windows上安装第二个MySQL
我的电脑原先已经有MySQL5.7了,由于需要,再装一个MySQL8
1、下载MySQL8的安装包MySQL :: Download MySQL Community Server
下载后进行解压,我放到和原来mysql5.7同样的目录下
2、创建所需目录和配置文件进入到MySQL8的解压文件夹下,创建data文件夹和my.ini配置文件
my.ini配置文件内容如下:
12345678910111213141516171819202122232425[mysqld]# 设置端口port=3307# 设置mysql的安装目录basedir=D:/softwar/mysql-8.0.36-winx64/mysql-8.0.36-winx64# 设置mysql数据库的数据的存放目录datadir=D:/software/mysql-8.0.36-winx64/mysql-8.0.36-winx64/data# 允许最大连接数max_connections=200# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统max_connect_errors=10# 服务端使用的字 ...
openVPN做代理
openVPN的服务端还可以起到代理的作用,将网络进行转发
一、搭建openVPN具体搭建过程见之前的文章:openVPN搭建 | Hawaii (hua-yiwei.github.io)
二、使用iptables代替防火墙2.1 安装iptables服务1yum -y install iptables-service
2.2 配置系统转发,并使配置立即生效1sysctl -w net.ipv4.ip_forward=1
2.3 关闭firewall12systemctl stop firewalld systemctl disable firewalld
2.4 启动iptables12systemctl enable iptables systemctl start iptables
2.5 配置iptables转发流量,代理主要以iptables转发实现1iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
2.6 允许tcp/udp 1194通 ...
openVPN搭建
一、openVPN服务端的搭建1、安装其他依赖包安装epel仓库和vim,tree
1yum install epel-release vim tree -y
2、安装rsa密钥生成工具安装rsa密钥生成工具
1yum install easy-rsa -y
安装完成后,可以看到在/usr/share/easy-rsa目录下后几个版本,这里只用3.0.8版本
3、生成ca证书和服务端、客户端证书3.1 创建/opt/easy-rsa目录用来生成与存放证书创建并进入/opt/easy-rsa目录
12mkdir /opt/easy-rsacd /opt/easy-rsa
3.2 复制相关文件到当前目录下因为只使用3.0.8版本,只复制这个版本的内容
12cp -a /usr/share/easy-rsa/3.0.8/* .cp -a /usr/share/doc/easy-rsa-3.0.8/vars.example ./vars
3.3 创建证书
初始化,在当前目录创建pki目录,用于存储证书
1./easyrsa init-pki
可以看到,当前目录下多了p ...
Transactional注解事务解析
@Transactional注解的事务逻辑是通过Aop代理实现的。生成代理的过程比较复杂,这里只讨论事务的核心逻辑。
1、spring boot的事务管理器spring boot提供了PlatformTransactionManager类来管理事务
可以看到,spring boot只提供了接口,可以允许不同的数据源进行实现。
因为我平时主要使用的是jdbc,因此主要看jdbc的实现类DataSourceTransactionManager。
DataSourceTransactionManager类继承了AbstractPlatformTransactionManager抽象类,而AbstractPlatformTransactionManager抽象类又实现了PlatformTransactionManager接口,类图关系如下:
2、几个重要的方法在事务的执行过程中,一般的阶段为:开始事务->执行sql->提交事务/回滚事务。
所以当我们看DataSourceTransactionManager类时,有几个方法是需要注意的:doBegin,doCommi ...