java工作笔记

工作笔记

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);

参数含义分别是:

  1. keyMapper:Key 的映射函数
  2. valueMapper:Value 的映射函数
  3. mergeFunction:当 Key 冲突时,调用的合并方法
  4. 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博客

2、Spring Junit

SpringBoot test_好习惯要坚持下去-CSDN博客_springboottest

本文档是本人5年JAVA经验整理的文档(持续性的),由于CSDN只能单个附件只能上传15MB,所以只好分包压缩了(4个包),希望各位同行能够理解。 本文档包括JAVA/FLEX/数据建模/Database/移动办公/项目管理/单点登录/软件架构/测试等相关性技术。 本文档还在持续维护中,各位可以通过《笔记变更说明》查看升级日志。 在这里声明下,本文档一部分是个人从学习、工作中整理出来的(代码都是经过调试的),还有一部分是从网上整理的。 本站相关文档都是经过后期整理的,或是在实际工作中整理的实例代码总结而成的。 由于本人目前允许上传的资源太小,所以无法上传整个的技术学习笔记JAVA 五年的工作经验和学习笔记),待以后有机会会分享给大家。 技术体系包括: J2SE/J2ME/J2EE/JAVA代码优化/Flex(BlazeDS、PureMVC等技术)/LDAP/C++/Portal/即时通讯/数据建模/UML/UML设计工具(Rose、EA、PD等)/移动办公(Android、Symbian、Wap等技术)/项目管理(敏捷开发等)/软件架构(NoSQL、SaaS、设计模式等)/数据库(MySQL、Oracle、EDB、SQLServer等)/测试(单元测试、压力测试)/linux服务器等 其中含有大量实例源代码。 这里需要说明的时,该文档是本人5年工作经验的积累,文档中大部分知识点来源于实际工作中的总结,(除了JAR等资源文件外)其代码都是可运行的,还有一部分知识来源于网络或者其他书籍,这里做一些收集,使该体系更加完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值