【无标题】

//

lombok

有参构造
@Accessors(chain = true) @Setter@Getter@RequiredArgsConstructor(staticName = “of”) public class Student { @NonNull private String name; private int age; }

Spring中类型转换服务ConversionService 以及 Converter 类型转换器
ConfigurableConversionService

json

//禁用 对象循环引用 避免$ref
JSON.toJSONString(obj,SerializerFeature.DisableCircularReferenceDetect)
VO vo = JSON.parseObject(“…”, VO.class, Feature.DisableCircularReferenceDetect)

//返回单引号包裹的string {‘aa’:‘aa’}
JSON.toJSONString(obj,SerializerFeature.UseSingleQuotes)

//泛型反序列化:
List list = JSON.parseObject(“…”, new TypeReference<List>() {});

//fastjson处理日期
JSON.toJSONStringWithDateFormat(date, “yyyy-MM-dd HH:mm:ss.SSS”)

EasyExcel

https://alibaba-easyexcel.github.io/index.html

https://blog.csdn.net/Chen_1999/article/details/119455582

//多sheet页读取—>匿名内部类式写法
InputStream in = serviceFile.getInputStream();
ExcelReader excelReader = EasyExcel.read(in).build();
HashMap<String, List<Map<Integer,String>>> dataMap = Maps.newHashMap();
Map<Integer,String> headMap = Maps.newHashMap();
List readSheets = excelReader.excelExecutor().sheetList();
for (ReadSheet readSheet : readSheets) {
EasyExcel.read(serviceFile.getInputStream(),new AnalysisEventListener<Map<Integer,String>>() {
private List<Map<Integer,String>> datas = new ArrayList<>();
@Override
public void invoke(Map<Integer,String> o, AnalysisContext analysisContext) {
//每读一行
datas.add(o);
}
@Override
public void invokeHeadMap(Map<Integer,String> map, AnalysisContext context) {
//列名
headMap.putAll(map);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
//全部读完的数据处理
dataMap.put(String.valueOf(DeptLevelEnum.getCodeByName(readSheet.getSheetName())), datas);
}
}).sheet(readSheet.getSheetName()).doRead();
}
导出多sheet
protected void exportDataTargetModel(JSONObject result, RtSummaryDto dto, HttpServletRequest request, HttpServletResponse response) throws Exception {
ExcelWriter excelWriter = null;
try {
JSONObject data = result.getJSONObject(“body”).getJSONObject(“data”);
//根据模板生成文件
//文件名
String fileName = “实时概况_目标设置_” + DateFormatUtils.format(new Date(), “yyyy-MM-dd”);
excelWriter = EasyExcel.write(getOutputStream(fileName, request, response)).build();
//列头
List headKeys = new ArrayList<>();
List<List> head = getHead(headKeys);

    if (0 != result.getIntValue(STATUS) || data == null || data.size() == 0) {
        logger.error("目标设置-模板下载error param:{}", dto);
        String sheetName = "目标设置_无数据";
        WriteSheet sheet = EasyExcel.writerSheet(sheetName).build();

        // 创建一个表格
        WriteTable table = new WriteTable();
        table.setHead(head);
        excelWriter.write(Lists.newArrayList(), sheet, table);
    } else {
        //根据结果创建多个sheet页
        String dataString = JSONObject.toJSONString(data);
        Map<String, Map<String, String>> allIdAndName = JSONObject.parseObject(dataString, Map.class);
        if (logger.isDebugEnabled()) {
            logger.debug("dataString======map:" + dataString);
        }
        for (Map.Entry<String, Map<String, String>> entry : allIdAndName.entrySet()) {
            String sheetName = DepartLevelEnum.getNameByCode(Integer.parseInt(entry.getKey()));
            if (logger.isDebugEnabled()) {
                logger.debug("entry.getKey():" + entry.getKey());
                logger.debug("sheetName:" + sheetName);
            }
            WriteSheet sheet = EasyExcel.writerSheet(Integer.valueOf(entry.getKey()), sheetName).build();
            // 创建一个表格
            WriteTable table = new WriteTable();
            table.setHead(head);

            List<List<Object>> list = getListObject(entry.getValue(), headKeys);
            excelWriter.write(list, sheet, table);
        }
    }
} catch (IOException e) {
    logger.error("下载目标设置模版失败", e);

} finally {
    if (excelWriter != null) {
        excelWriter.finish();
    }
}

}

Java8 list

addAll 报 java.lang.UnsupportedOperationException: null 错误
总之,Arrays.asList 返回的 List 是一个不可变长度的列表,此列表不再具备原 List 的很多特性,因此慎用 Arrays.asList 方法。
解决 List commonArrayList = new ArrayList<>(Arrays.asList(“a”,“b”,“c”));

单元素list
Collections.singletonList( - )
单元素set
Collections.singleton( - )

先判空再遍历
Optional.ofNullable(node)
.map(CatalogueTreeNode::getChild)
.orElse(Collections.emptyList());
/**

  • 去重字符串重复
  • @param stringList 字符串List
  • @return 返回去重字符串
    */
    public static List removeStringListDupli(List stringList) {
    Set set = new LinkedHashSet<>();
    set.addAll(stringList);
    stringList.clear();
    stringList.addAll(set);
    return stringList;
    }

/**
* 根据对象属性去重 属性:userId
* @param persons
* @return
*/
public static List removeDupliById(List persons) {
Set personSet = new TreeSet<>((o1, o2) -> o1.getUserId().compareTo(o2.getUserId()));
personSet.addAll(persons);
return new ArrayList<>(personSet);
}

/**
 * 根据对象多个属性去重 属性:userId + userName
 * @param persons
 * @return
 */
public static List<UserInfo> removeDupliByMorePro(List<UserInfo> persons){
    List<UserInfo> personList = persons.stream().collect(Collectors
            .collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> {
        // 根据useId和userName进行去重
        return o.getUserId() + "," + o.getUsername() +"," + o.getAge();
    }))), ArrayList::new));
    return  personList;
}

/**
 * 根据对象单个属性去重 属性:userId
 * @param persons
 * @return
 */
public static List<UserInfo> removeDupliByUserId(List<UserInfo> persons){
    List<UserInfo> unique = persons.stream().collect(Collectors

.collectingAndThen(toCollection(() -> new TreeSet<>(comparingLong(UserInfo::getUserId))), ArrayList::new)
);
return unique;
}

/**
 * 根据对象单个属性去重 属性:userId
 * @param persons
 * @return
 */
public static List<UserInfo> removeDupliByUserIdNew(List<UserInfo> persons){

    List<UserInfo> personList = new ArrayList<>();
    persons.stream().filter(distinctByKey(p -> p.getUserId()))
            .forEach(p -> personList.add(p));
    return personList;
}

/**
 * 根据key去重重复
 * @param keyExtractor key执行器
 * @param <T>          泛型
 * @return
 */
public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
    Map<Object, Boolean> map = new ConcurrentHashMap<>();
    return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}

maven测试用例相关

org.apache.maven.pluginsmaven-surefire-plugin2.19

会在打包前 maven test
默认会根据junit执行测试用例
跳过测试用例

org.apache.maven.plugins
maven-surefire-plugin
2.19.1

true


在默认情况下,maven-surefire-plugin的test目标会自动执行测试源码路径(默认为src/test/java/)下所有符合一组命名模式的测试类。这组模式为:
*/Test.java:任何子目录所有命名以Test开头的Java类。
**/*Test.java:任何子目录下所有命名以Test结尾的Java类。
**/*TestCase.java:任何子目录下所有命名以TestCase结尾的Java类。
只要将测试类按上述模式命名,Maven就能自动运行他们,用户也就不再需要定义测试集合(TestSuite)来聚合测试用例(TestCase)。关于模式需要注意的是,以Test结尾的测试类是不会得以自动执行的。

泛化调用

泛化调用 是指不依赖接口API 根据指定接口方法名称和参数找到指定接口
Dubbo例子:
泛化调用主要用于消费端没有 API 接口的情况;不需要引入接口 jar 包,而是直接通过 GenericService 接口来发起服务调用,参数及返回值中的所有 POJO 均用 Map 表示。泛化调用对于服务端无需关注,按正常服务进行暴露即可。

<dubbo:reference id=“userService” interface=“com.alibaba.dubbo.samples.generic.api.IUserService” generic=“true”/>

// 需要使用的地方,通过强制类型转化为 GenericService 进行调用:

GenericService userService = (GenericService) context.getBean(“userService”);

// primary param and return value

String name = (String) userService.$invoke(“delete”, new String[]{int.class.getName()}, new Object[]{1});

System.out.println(name);

原理无非就是将泛化调用转化为普通调用,关键在于对象的表示和序列化。
首先,Client会通过动态代理创建GenericService的代理类; 然后,会经过一系列过滤链(优先级排序,默认不需要,大的优先级高)
ConsumerExceptionFilter order = -20000 RpcReferenceContextFilter order = -19500 ConsumerGenericFilter order = -18000 ConsumerTracerFilter order = -10000 ConsumerInvoker 这里会进行真正的业务的调用
在泛化调用过滤器(ConsumerGenericFilter)中,会进行下列操作:
★设置序列化工厂类型为普通序列化(序列化反序列化均使用SofaSerializerFactory,值为0),并设置到Request参数中。
★进行调用参数($invoke参数)的修正,变成普通的调用参数(调用方法,调用参数类型,调用参数值)
★设置调用类型
最后,使用SOFABolt协议进行进行网络调用。

String

显示00,01,02 格式数
String.format(“%02d”,2);

记录一下是工作中遇到的问题
贴上错误:
Could not read JSON: Cannot construct instance of java.util.ArrayList$SubList(no Creators, like default construct, exist): no default no-arguments constructor found

原因是读取Redis缓存时,报错异常导致!

原因是缓存中是集合ArrayList中含有SubList,因为SubList不能序列化和反序列化,导致解析失败。

解决办法:

1、若存在使用SubList方法,只需要 重新new 下:

原代码: channelList = channelList.subList(0, 10);

改正后: channelList = new ArrayList<>(channelList.subList(0, 10));

2、若通过 Lists.partition(list, 10)获取的,则需要将subList转为ArrayList

用: Lists.newArrayList(subList)

over!!!
————————————————
版权声明:本文为CSDN博主「hi丶柒陌」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39676186/article/details/121958770

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值