1.java8的特性回顾
1.拼接join
List<String>list =Arrays.asList("Java","Python","Javascript");
// 使用 Collectors.joining()将元素连按成字符串
String result = list.stream().collect(collectors.joining(",“));
System.out.println(result);// 出:Java,Python, JavaScript
2.limit和skip
limit和skip可以结合使用
limit,只取前几条
skip跳过前几条
先skip(n)再limit(m):跳过n条后取m条
1.limit(long n)
//保留处理结果中的前n个元素。
userList = userList.stream().limit(1).collect(Collectors.toList());
2.skip(long n)
//去除(跳过)处理结果中的前n个元素
3. 从处理结果中保留2个元素,再从保留的2个元素中去除第1个元素
userList = userList.stream().limit(2).skip(1).collect(Collectors.toList());
4.从处理结果中去除2个元素后,再保留1个元素
userList = userList.stream().skip(2).limit(1).collect(collectors.toList());
3.toMap和groupBy
groupBy分组
value通常是list
key相同的时候,value会被放到这个key对应的list中
toMap
value为空的时候,会报错
可以改成传统写法,也可以先把value为空的过滤掉
Map<string, string> package2AppNameMap =new HashMap<>()
packageNameMap.forEach(stringstringMap ->{
package2AppNameMap.put(stringstringMap.get(constants.PAcKAGE_NAME),
stringstringMap.get(constants.APP_NAME));
}):
key相同的时候,要写明处理方式,取新value还是旧value,否则会报错
Map<String, Person> nameToPersonMap = people.stream()
.collect(Collectors.toMap(
Person::getName, // 键
person -> person, // 值使用对象自身
(existingValue, newValue) -> newValue // 合并函数,选择新值
));
4.min和max
不用sort再get(0)了,可以直接用max,min函数
函数里边是排序方式
List<String> strings = Arrays.asList("apple", "banana", "cherry", "date");
Optional<String> shortestString = strings.stream()
.min((s1, s2)->s1.length()- s2.length());
if (shortestString.isPresent()){
System.out.println("Shortest string:"+ shortestString.get());
else{
System.out.println("No strings in the list.");
}
5.流的操作不会改变原集合,会生产新的集合,
List<String> newList = list.stream().xxx.
但是foreach时,可以对属性进行修改
2.Mybatis方法不能重载
MyBatis方法重载MyBatis中的Mapper接口方法不支持重载。
这主要是因为MyBatis通过动态代理来生成Mapper接口的实现类,当你调用一个Mapper接口的方法时,MyBatis会根据方法名和参数来选择合适的 SQL语句Q进行执行。如果允许方法重载,即允许多个方法拥有相同的方法名但不同的参数列表,那么MyBatis在解析时会无法准确地确定应该调用哪一个方法,从而导致调用的方法具有不确定性。
具体来说,MyBatis是通过Mapper接口方法名来映射SQL语句的。如果允许方法重载,那么就会出现方法名相同但参数不同的情况,这时MyBatis就无法准确地根据方法名来映射正确的SQL语句。为了避免这种混淆和不确定性,MyBatis在设计时决定禁止Mapper接口方法的重载。
3.git把多个commit合并成一个
现在的现象是,我本地git status显示我比远程早了10个提交
因为我之前提交到远程的还没被合并
然后如果我让人一个一个给我合并,就比较麻烦,他们要审批十次
所以我就把这十个合并成一个
方法如下
1.$ git rebase -i HEAD~10
# 从HEAD版本开始往过去数10个版本
2.把除了第一条之外的pick,都改成s,然后保存
执行上一条命令后,会出来一个编辑框,把除了第一条之外的pick,都改成s,然后保存
3.然后再push一次
4.当程序里有多个@Schedule时
@Scheduled注解 默认是串行执行的,多个定时任务会互相阻塞。 在默认情况下,Spring的@Scheduled注解使用单线程线程池执行定时任务,这意味着如果一个任务正在执行,其他任务需要等待当前任务执行完毕才能继续执行
对于schedule应该可以开启一个线程池配置,但是我没继续研究
所以两个@schedule之间就要考虑是否要中间隔一段时间,比如第一个@schedule设置的是整点执行,那第二个是否要设置为半点执行
5.数据库大小写问题和程序中contains处理要一致
这是接手别人程序时发现的一个问题
mysql有个字段package_name建了唯一索引,代码中确实做了contains判断,意思表里有这个值就不要重复插入
但是contains是区分大小写的
比如我数据库里有个package_name是A,然后我又传来了一个a,那这个时候contains是返回false,意思是数据库中不存在,就会继续往下走。但是到insert数据库的时候就会因为唯一索引重复而报错。
我补救方式是:contains比较的时候,我把表里边取到的数据,还有传进来的,都toLowercase()
转成小写比较
6.需要分库分表的,可以考虑分区表
这个图片,说什么都粘贴不上来了,闹心。不知道是csdn的问题还是公司电脑问题。
1.创建分区表
5.创建分区表
创建分区表的语法与普通表略有不同,主要是需要指定分区策略:
CREATE TABLE partitioned table(
id INT,
value VARCHAR(100)
)
PARTITION BY RANGE(id)(
PARTITION PI VALUES LESS THAN(10),
PARTITION P2 VALUES LESS THAN(20),
PARTITION P3 VALUES LESS THAN(MAXVALUE)
);
对于分区表来说,增删改查语句和普通语句没任何区别,数据库会按照分区规则去执行
更新分区表的语法与普通表相同,但需要注意更新操作可能会影响分区:
如果更新分区键的值,可能导致数据移动到另一个分区。
但是查询语句不用改,查询的时候就自动按照分区的规则来查了。
2.查询的时候也可以加上分区,可以提高性能
SELECT * FROM partitioned table WHERE partition key = value;
7.一个java程序为什么会看到多个进程?
ps -ef之后会出现两列,PID和PPID
其中PID是当前进程,PPID是父进程
8.泛型和静态方法
类中的非静态方法,可以用定义这个类的时候,传过来的泛型
类中的静态方法,不能用定义这个类时传过来的泛型,需要在自己的静态方法上,自己定义
public class ResultDTO<T> {
//非静态方法,可以使用类传过来的泛型
public ResultDTO<T> success(T data){ return success(data, msg: "success"); }
//静态方法,不能用类上边传过来的泛型需要自己使用<T>声明下
public static <T> ResultDTO<T> success(T data, string msg){
ResultDTO<T> result = new ResultDTO<>();
result.setCode(ResponsecodeEnum.SuccEss.getcode());
result.setMsg(msg);
result.setData(data):
return result;
}
泛型类中的静态方法不能使用类的泛型而应该将该方法定义为泛型方法的原因是:
在java中泛型只是一个占位符,必须在传递类型后才能使用泛型,
类实例化时才能真正的传递类型参数,
由于静态方法的加载先于类的实例化,也就是说类中的泛型还没有传递真正的类型参数,静态的方法就已经加载完成了。
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 2024-09学习笔记
发表评论 取消回复