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、创建提取方法
privatePredicate distinctByKey(Function super T, Object> keyExtractor) { Map
2、利用filter
ListcodeDistinctList = testCommodityList .stream() .filter(distinctByKey(TestCommodity::getCode)) .collect(Collectors.toList());
二、根据对象中多个个属性去重,利用collectingAndThen
ListcbList = testCommodityList .stream() .collect( Collectors.collectingAndThen( Collectors.toCollection( () -> new TreeSet<>( Comparator.comparing( tc -> tc.getCode() + ";" + tc.getBarCode()))), ArrayList::new));
三、分组后取价格最高的对象
MapmaxPriceCommodityMap = 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 mergeFunction);
toMap(Function super T, ? extends K> keyMapper, Function super T, ? extends U> valueMapper,
BinaryOperator mergeFunction, Supplier mapSupplier);
参数含义分别是:
- keyMapper:Key 的映射函数
- valueMapper:Value 的映射函数
- mergeFunction:当 Key 冲突时,调用的合并方法
- mapSupplier:Map 构造器,在需要返回特定的 Map 时使用
还是用上面的例子,如果 List 中 userId 有相同的,使用上面的写法会抛异常:
ListuserList = 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 排序的,可以使用如下写法:
List7.No mapping for GET /swagger-ui.htmluserList = 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-> 王五
SpringBoot使用Swagger2本来可以使用的,后来出现的异常No mapping for GET /swagger-ui.html,这个异常其实不用怎么解释,说白了就是找不到了。
遇到这种情况请先查找,最近你所添加继承了【WebMvcConfigurationSupport】的类
如果继承了WebMvcConfigurationSupport,则在配置文件在中配置的相关内容会失效,需要重新指定静态资源
需要重新指定swagger静态资源
@Configuration
public class WebMvcConfigurer extends WebMvcConfigurationSupport {
@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
Listdocker 1、启动mysqllist = 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 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.232、启动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、启动kafka1. 启动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
技术文档
1、MyBatis-Plus 常用注解
java 实体类 临时注解_MyBatis-Plus 常用注解_weixin_39933026的博客-CSDN博客
2、Spring JunitSpringBoot test_好习惯要坚持下去-CSDN博客_springboottest



