相关文章推荐
飞翔的投影仪  ·  Collectors.groupingBy ...·  1 周前    · 
爱热闹的海龟  ·  java ...·  1 周前    · 
失恋的铁板烧  ·  vue3 + ts +vant ...·  1 周前    · 
谦逊的硬币  ·  c# list.findall - CSDN文库·  1 周前    · 
乐观的火锅  ·  matlab ...·  3 周前    · 
失眠的桔子  ·  generate jaxb from ...·  1 年前    · 

前言背景描述:


开发使用本来是直接使用数据库的依据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的方案替换
 

streamcollect Collector.toMap()有两个参数的方法和四个参数的方法,两个参数的方法默认使用hashmap,会使乱序,与原集合顺序不同。四个参数最后一个参数可以指定mapLinkedHashMap::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就是其的一种 所以解决问题的思路就是将hashmaplinkedhashmap就好了 那么该如何呢?这里推荐使用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&lt;K,V&gt; extends HashMap&lt;K,V&gt; impleme... SimpleCacheWithSpringAop ##SrpingAop 需要配合Spring Aop使用,功能还比较单一,只是在获取数据的时候先进行缓存的查找,找不到的话,在方法内取得数据然后放入缓存。 ##Annotation 利用Annotation判断是否进行缓存,因为可能有多种类型数据需要缓存,所以根据Type()值进行判断。 ##缓存时效 为了缓存的时效性,可以设置过期时间和List的长度。 插件使用的是非线程安全的linkedhashMap,如果需要有线程安全的特性的话,可以采用 或者其他的线程同步的手段