前言背景描述:
开发使用本来是直接使用数据库的依据SQL进行group By获取到数据表的分组的一个字段的字符串,可是后来字符串越来越多越长,导致的最后的后面长度超多1024个汉字就会被截取,所以需要重新的重构方案进行字符串处理。
原始方案:
SELECT GROUP_CONCAT(t.factor_contant) as 'factor_contants' , t.factor_value as 'factor_value' from tbm_factor_config t where t.factor_type=5 GROUP BY t.factor_value;
得到的结果:
最后的factor_contants 字段超长了,导致后续的字符创获取不到,会导致配置失效!
修改方案为List获取数据表数据,order by 之后进行List使用流式Stream转成
LinkedHashMap,
然后返回配置就可以的。
JDK8使用Stream的把
List使用流式Stream转成
LinkedHashMap
Map<Integer, List<TbmFactorConfig>> tbmFactorConfigMap = tbmFactorConfigList.stream().collect(Collectors.groupingBy(TbmFactorConfig::getFactorValue, LinkedHashMap::new, Collectors.toList()));
代码效果:
@Override
public List<TbmFactorConfig> getFactorConfigByGourp(Integer fileType) {
List<TbmFactorConfig> tbmFactorConfigList = tbmFactorConfigMapper.getFactorListByGroup(fileType);
if (CollectionUtils.isEmpty(tbmFactorConfigList)) {
return null;
Map<Integer, List<TbmFactorConfig>> tbmFactorConfigMap = tbmFactorConfigList.stream().collect(Collectors.groupingBy(TbmFactorConfig::getFactorValue, LinkedHashMap::new, Collectors.toList()));
List<TbmFactorConfig> resultTbmFactorConfig = new ArrayList<TbmFactorConfig>();
tbmFactorConfigMap.keySet().forEach(item -> {
TbmFactorConfig tbmFactorConfig = new TbmFactorConfig();
tbmFactorConfig.setFactorValue(item);
String factorValues = tbmFactorConfigMap.get(item).stream().map(factorConfig -> factorConfig.getFactorContant()).collect(Collectors.joining(","));
tbmFactorConfig.setFactorContant(factorValues);
tbmFactorConfig.setFactorWeight(tbmFactorConfigList.get(0).getFactorWeight());
resultTbmFactorConfig.add(tbmFactorConfig);
log.error("目前获取到的map的key: {},获取到的value是:{} ", item, factorValues);
return resultTbmFactorConfig;
打印出来的日志:
FactorConfigDaoImpl :目前获取到的map的key: 80,获取到的value是:FX168北美,TechWeb,北京日报,花网专稿,中国新闻网,中华工商时报
FactorConfigDaoImpl :目前获取到的map的key: 85,获取到的value是:中国基金报
FactorConfigDaoImpl :目前获取到的map的key: 87,获取到的value是:盖世汽车,盖世汽车快讯,中国汽车工业信息网
FactorConfigDaoImpl :目前获取到的map的key: 88,获取到的value是:机床商务网,中钢网,中国化工报,中国数字视听网,中国水网
FactorConfigDaoImpl :目前获取到的map的key: 90,获取到的value是:环球网,中国网科技,北京商报,中财网,中国机床工具工业协会
FactorConfigDaoImpl :目前获取到的map的key: 91,获取到的value是:中关村在线
FactorConfigDaoImpl :目前获取到的map的key: 92,获取到的value是:全国企业破产重整案件信息网
FactorConfigDaoImpl :目前获取到的map的key: 94,获取到的value是:格隆汇,深圳商报
完美的实现SQL的方案替换
stream流collect中 Collector.toMap()有两个参数的方法和四个参数的方法,两个参数的方法默认使用hashmap,会使乱序,与原集合顺序不同。四个参数中最后一个参数可以指定map,LinkedHashMap::new,第三个参数是mergeFunction,当 Key 冲突时,调用的合并方法。这里用LinkedHashMap就是有序的啦。这里默认使用的是hashmap。
错误信息:
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to org.hbcm.sap.api.dto.EmailDTO
解决方案:
com.alibaba
fastjson
1.2.28
实现将LinkedHashMap转为Json字符串,再转为JSON对象,最后转为实体List
Controller接受参数类型
@PostMapping("/saveSu
我是用stream遍历数据的时候,最后需要返回有序的Map集合 即:LinkedHashMap,但是我看到Collectors里面并没有返回LinkedHashMap的方法。
我们都知道,hashmap本身是无序的,不可能做到排序,但是有时候又要排序该怎么办呢?
既然hashmap不行,那么有没有那种map集合是有序的呢?当然有,linkedhashmap就是其中的一种
所以解决问题的思路就是将hashmap转成linkedhashmap就好了
那么该如何转呢?这里推荐使用java8的stream流操作来转化
我正在使用resteasy在一些宁静的Web服务之间发送键/值对.发布这些对的列表我使用此代码段List pairs = new ArrayList<>();pairs.add(new Pair("name", "Arnold"));pairs.add(new Pair("age", "20"));ResteasyClient resteasyClient = getClient();...
一、LinkedHashMap
LinkedHashMap会将元素串起来,形成一个双链表结构。可以看到,其结构在HashMap结构上增加了链表结构。数据结构为(数组 + 单链表 + 红黑树 + 双链表),图中的标号是结点插入的顺序
1. 类的继承关系
public class LinkedHashMap<K,V> extends HashMap<K,V> impleme...
SimpleCacheWithSpringAop
##SrpingAop
需要配合Spring Aop使用,功能还比较单一,只是在获取数据的时候先进行缓存的查找,找不到的话,在方法内取得数据然后放入缓存。
##Annotation
利用Annotation判断是否进行缓存,因为可能有多种类型数据需要缓存,所以根据Type()值进行判断。
##缓存时效
为了缓存的时效性,可以设置过期时间和List的长度。
插件中使用的是非线程安全的linkedhashMap,如果需要有线程安全的特性的话,可以采用 或者其他的线程同步的手段