工作笔记
java
1、去除字符串拼接后,前后逗号
public static void main(String[] args) {
String s = ",123,456,";
if (s.startsWith(",")){
s = StringUtils.removeStart(s, ",");
}
if (s.endsWith(",")){
s = StringUtils.removeEnd(s, ",");
}
System.out.println(s);
}
2、java 8 利用stream针对List集合根据对象属性去重
一、根据对象中某个属性去重
1、创建提取方法
private <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
Map<Object, Boolean> concurrentHashMap = new ConcurrentHashMap<>();
return t -> concurrentHashMap.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
2、利用filter
List<TestCommodity> codeDistinctList = testCommodityList
.stream()
.filter(distinctByKey(TestCommodity::getCode))
.collect(Collectors.toList());
二、根据对象中多个个属性去重,利用collectingAndThen
List<TestCommodity> cbList = testCommodityList
.stream()
.collect(
Collectors.collectingAndThen(
Collectors.toCollection(
() -> new TreeSet<>(
Comparator.comparing(
tc -> tc.getCode() + ";" + tc.getBarCode()))), ArrayList::new));
三、分组后取价格最高的对象
Map<String, TestCommodity> maxPriceCommodityMap = testCommodityList
.stream()
.collect(
Collectors.groupingBy(
TestCommodity::getCode,
Collectors.collectingAndThen(
Collectors.maxBy(
Comparator.comparingDouble(TestCommodity::getPrice)),Optional::get)));
四、附java8 map 遍历方法
maxPriceCommodityMap.forEach((k, v) -> System.out.println(k + ":" + v));
3、list中内容逗号拼接
方法1
String symbol = Joiner.on(",").join(symbolList);
方法2
String symbol = StringUtils.join(symbolList.toArray(), ",");
4、本地断点调试发现返回对象里面有参数,浏览器控制台没有
1.看看是不是没有编译到class文件中
2.该对象是否有get set方法
5、MyBatis执行DDL语句错误
1.排除语句错误后,看是否用#获取了数据
6、Collectors.toMap 希望value是当前对象
userList.stream().collect(Collectors.toMap(User::getId, User::getName));
userList.stream().collect(Collectors.toMap(User::getId, t -> t));
或:
userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));
关于 Collectors.toMap 方法
Collectors.toMap 有三个重载方法:
toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper);
toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction);
toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier);
参数含义分别是:
- keyMapper:Key 的映射函数
- valueMapper:Value 的映射函数
- mergeFunction:当 Key 冲突时,调用的合并方法
- mapSupplier:Map 构造器,在需要返回特定的 Map 时使用
还是用上面的例子,如果 List 中 userId 有相同的,使用上面的写法会抛异常:
List<User> userList = Lists.newArrayList(
new User().setId("A").setName("张三"),
new User().setId("A").setName("李四"), // Key 相同
new User().setId("C").setName("王五")
);
userList.stream().collect(Collectors.toMap(User::getId, User::getName));
// 异常:
java.lang.IllegalStateException: Duplicate key 张三
at java.util.stream.Collectors.lambda$throwingMerger$114(Collectors.java:133)
at java.util.HashMap.merge(HashMap.java:1245)
at java.util.stream.Collectors.lambda$toMap$172(Collectors.java:1320)
at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at Test.toMap(Test.java:17)
...
这时就需要调用第二个重载方法,传入合并函数,如:
userList.stream().collect(Collectors.toMap(User::getId, User::getName, (n1, n2) -> n1 + n2));
// 输出结果:
A-> 张三李四
C-> 王五
第四个参数(mapSupplier)用于自定义返回 Map 类型,比如我们希望返回的 Map 是根据 Key 排序的,可以使用如下写法:
List<User> userList = Lists.newArrayList(
new User().setId("B").setName("张三"),
new User().setId("A").setName("李四"),
new User().setId("C").setName("王五")
);
userList.stream().collect(
Collectors.toMap(User::getId, User::getName, (n1, n2) -> n1, TreeMap::new)
);
// 输出结果:
A-> 李四
B-> 张三
C-> 王五
7.No mapping for GET /swagger-ui.html
SpringBoot使用Swagger2本来可以使用的,后来出现的异常No mapping for GET /swagger-ui.html,这个异常其实不用怎么解释,说白了就是找不到了。
遇到这种情况请先查找,最近你所添加继承了【WebMvcConfigurationSupport】的类
如果继承了WebMvcConfigurationSupport,则在配置文件在中配置的相关内容会失效,需要重新指定静态资源
需要重新指定swagger静态资源
@Configuration
public class WebMvcConfigurer extends WebMvcConfigurationSupport {
/**
* 发现如果继承了WebMvcConfigurationSupport,则在yml中配置的相关内容会失效。 需要重新指定静态资源
*
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations(
"classpath:/static/");
registry.addResourceHandler("swagger-ui.html").addResourceLocations(
"classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations(
"classpath:/META-INF/resources/webjars/");
super.addResourceHandlers(registry);
}
}
8.Java8流sorted排序-多字段升序降序Null值排序
// 1.一降一升,注意两种写法
// 先以name升序,升序结果进行name降序,再进行age升序(有效)
list.stream().sorted(Comparator.comparing(User::name).reversed().thenComparing(User::age));
// 先以name降序,再进行age升序(有效)
list.stream().sorted(Comparator.comparing(User::name,Comparator.reverseOrder()).thenComparing(User::age));
// 2.双降,注意两种写法
// 先以name升序,升序结果进行name降序,再进行age升序,结果就是name和age都降序(测试无效,不知道写法是不是错了,求指点)
list.stream().sorted(Comparator.comparing(User::name).reversed().thenComparing(User::age).reversed);
// 先以name降序,再进行age降序(有效)
list.stream().sorted(Comparator.comparing(User::name,Comparator.reverseOrder()).thenComparing(User::age,Comparator.reverseOrder()));
// 3.包含Null数据的集合排序
// nullsFirst,age为空值的排在在前边,nullsLast相反
sorted(Comparator.comparing(User::age, Comparator.nullsFirst(Integer::compareTo)))
9.java 8 stream list 对象 转map
List<Person> list = new ArrayList<>();
1.对象中的属性转map 通过Collectors.toMaplist.stream().collect(Collectors.toMap(Person::getId,Person::getName));
2.收集对象本身list.stream().collect(Collectors.toMap(Person::getId,list->list));list->list 是一个返回本身的lambda表达式,还可以用function接口中的一个默认方法Function.identity(),返回对象本身
list.stream().collect(Collectors.toMap(Person::getId,Function.identity()));
3.key重复的情况,key有可能重复,会跑出异常:java.lang.illegalStateException:Duplicate key.这时候就要在toMap方法指定当前key冲突时key的选择,这里时第二个key覆盖第一个keylist.stream().collect(Collectors.toMap(Person::getName,Function.identity(),(key1,key2)->key2));
4.根据一个字段或者属性分组也可以直接用groupingby方法list.list(100).collect(Collectors.groupingBy(Person::getAge));通过partitioningBy 进行分组list.limit(100).collect(Collectors.partitioningBy(p-P.getAge()<18));
docker
1、启动mysql
docker run --restart=always --name mysql -v /home/kewen/Applications/mysql/data:/var/lib/mysql\
-v /home/kewen/Applications/mysql/my.cnf:/etc/mysql/conf.d/mysql.cnf\
-p 3306:3306\
-e "MYSQL_ROOT_PASSWORD=123456" -e "MYSQL_ROOT_HOST=%"\
-d mysql:5.7.23
2、启动redis
docker run -itd --restart=always --name redis\
-v /home/kewen/Applications/redis/redis.conf:/etc/redis/redis.conf\
-v /home/kewen/Applications/redis/data:/data\
-p 6379:6379 redis redis-server /etc/redis/redis.conf
异常情况:
docker 里 启动redis之后就立马挂掉?
检查配置文件是否设置了daemonize yes,如果是,就要改为daemonize no,因为该选项让redis成为在后台运行的守护进程,而docker容器必须要有一个前台进程才能留存。
3、启动kafka
1. 启动Zookeeper
docker run --restart=always -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper
2. 启动Kafka
docker run -d --name kafka \
-p 9092:9092 \
-e KAFKA_BROKER_ID=0 \
-e KAFKA_ZOOKEEPER_CONNECT=10.0.4.11:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://10.20.2.42:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka
3. 搭建Kafka集群
docker run -d --name kafka1 \
-p 9093:9093 \
-e KAFKA_BROKER_ID=1 \
-e KAFKA_ZOOKEEPER_CONNECT=<宿主机IP>:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://<宿主机IP>:9093 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9093 -t wurstmeister/kafka
搭建elasticsearch
docker run -d --name elasticsearch -e ES_JAVA_OPTS="-Xms1g -Xmx1g" -e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 -v /data/es/data:/usr/share/elasticsearch/data -v /work/es/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml docker.elastic.co/elasticsearch/elasticsearch:7.7.0
#文件名 elasticsearch.yml
cluster.name: "docker-cluster"
network.host: 0.0.0.0
# 配置远程访问
http.host: 0.0.0.0
# 因为elasticsearch与elasticsearch-head工具是前后端分离项目,所以需要处理跨域问题
http.cors.enabled: true
http.cors.allow-origin: "*"
# 开启账户密码验证
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
# 进入容器内
docker exec -it es bash
# 设置elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user 这些用户的密码
bin/elasticsearch-setup-passwords interactive
4.启动nacos
docker run -d \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=10.0.10.181 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e MYSQL_SERVICE_DB_NAME=ry-config \
-p 8848:8848 -p 9848:9848 -p 9849:9849 \
--restart=always \
--name nacos \
nacos/nacos-server
4、docker自动打包
- 1.准备工作:linux、git、docker
- 2.编写Dockerfile
FROM anapsix/alpine-java:8_server-jre_unlimited
MAINTAINER kw@163.com
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN mkdir -p /jar包名(<artifactId>xxx</artifactId>)
WORKDIR /jar包名
EXPOSE 8085(暴露的端口)
ADD ./jar包名/target/xxx.jar ./
CMD sleep 5;java -Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom -jar xxx.jar
- 3.编写docker-compose.yml
# 1. 无需修改源码,根目录 docker-compose up 即可
# 2. 静静等待服务启动
# version 版本兼容性(https://blog.csdn.net/huangjinjin520/article/details/124054043)
# 3.0 1.13.0+
# 2.0 1.10.0+
version: '2'
services:
jar包名:
build:
context: ./
dockerfile: ./jar包名/Dockerfile
restart: always
container_name: jar包名
image: jar包名
ports:
- 8085:8085
- 4.编写后端shell脚本
#!/bin/sh
rootdir="/work/project/"
backdir="${rootdir}tps-local/" --包根目录
profile=dev --分支名
serviceName="$1" -- 指定包名
cd $backdir
git pull
cd ${backdir}/${serviceName}
mvn clean install -Dmaven.test.skip=true -P${profile}
docker-compose up -d --force-recreate --build ${serviceName}
- 5.前端打包json(部分)
"scripts": {
"build:fiveTest": "vue-cli-service build --mode --m=fiveTest && npm run war",
"war": "cd dist && jar -cvf tps_local_bd.war *"
}
- 6.编写前端shell脚本
#!/bin/sh
rootdir="/work/project/"
frontdir="${rootdir}tps-local-ui/"
profile=dev
cd $frontdir
git pull
cd ${frontdir}hsa-tps-local-static
npm run build:fiveTest
mv ${frontdir}hsa-tps-local-static/dist/tps_local.war /work/apache-tomcat-9.0.46/webapps/tps_local.war
技术文档
1、MyBatis-Plus 常用注解
java 实体类 临时注解_MyBatis-Plus 常用注解_weixin_39933026的博客-CSDN博客