jdk8

2023-10-27

最近呢,看到应该系统应用中有一个一二级缓存模块的设计(基于google guava和redis的一二级缓存设计实现),早期设计虽然鉴于当时实践考虑已经自我感觉涉及还不错,但是最近再看到这块代码,有一种想要继续提炼升华的冲动。鉴于此,有了本篇中在设计中基于Supplier的实践场景应用。

1.场景再现

类图

如上图,抽象类AbstractCacheManager<K,HK,V>的若干个子类实现了相关方法,但是部分方法依然存在冗余特征。

我们来看一下子类的实现示例

/**
 * @description: 行政编码-缓存管理器
 * @Date : 2019/5/5 下午5:32
 * @Author : 石冬冬-Seig Heil
 */
@Component
@Slf4j
public class SimpleDistrictCacheManager extends AbstractCacheManager<String,String,Result<List<SimpleDistrictRe>>> {

    @Autowired
    DiamondConfig diamondConfig;

    @Autowired
    DictionaryRegFacade dictionaryRegFacade;
    /**
     * short name
     */
    final String SHORT_NAME = CacheShortName.simpleDistrictCache.name();
    /**
     * 省份列表缓存key
     */
    final String PROVINCE_CACHE_KEY = "provinceCache";
    /**
     * 二级行政缓存key
     */
    final String SECONDARY_DISTRICT_CACHE_KEY = "secondaryDistrictCache";
    /**
     * 行政缓存key
     */
    final String DISTRICT_CACHE_KEY = "districtCache";
    /**
     * 联动缓存 Key 前缀
     */
    final String GANGED_CACHE_KEY = "gangedCache";
    /**
     * 默认失效时间-2小时(单位秒)
     */
    final long DEFAULT_EXPIRE_SECONDS = 7200;
    /**
     * 根据父级行政查询下级
     * @param parentCode
     * @return
     */
    public Result<List<SimpleDistrictRe>> queryCitiesByParentCode(String parentCode){
        if(!useCache()){
            return dictionaryRegFacade.queryCitiesByParentCode(parentCode);
        }
        Result<List<SimpleDistrictRe>> queryResult;
        try {
            CacheContext<Result<List<SimpleDistrictRe>>> context = CacheContext.<Result<List<SimpleDistrictRe>>>builder()
                    .key(parentCode).reference(TypeReferences.SIMPLE_DISTRICT_TYPE).expireSeconds(DEFAULT_EXPIRE_SECONDS)
                    .callback(() -> Optional.ofNullable(dictionaryRegFacade.queryCitiesByParentCode(parentCode))).build();
            queryResult = primaryCache().get(parentCode,() -> super.getFromSecondary(context));
        } catch (ExecutionException e) {
            log.info("{} focus on an exception,then execute queryDB,parentCode={}",SHORT_NAME,parentCode,e);
            queryResult = dictionaryRegFacade.queryCitiesByParentCode(parentCode);
            log.info("{} focus on an exception,then execute queryDB,parentCode={},value={}",SHORT_NAME,parentCode, JSONObject.toJSONString(queryResult));
        }
        return queryResult;
    }

    /**
     * 查询省份列表
     * @return
     */
    public Result<List<SimpleDistrictRe>> queryProvinces(){
        if(!useCache()){
            return dictionaryRegFacade.queryProvinces();
        }
        Result<List<SimpleDistrictRe>> queryResult;
        try {
            CacheContext<Result<List<SimpleDistrictRe>>> context = CacheContext.<Result<List<SimpleDistrictRe>>>builder()
                    .key(PROVINCE_CACHE_KEY).reference(TypeReferences.SIMPLE_DISTRICT_TYPE).expireSeconds(DEFAULT_EXPIRE_SECONDS)
                    .callback(() -> Optional.ofNullable(dictionaryRegFacade.queryProvinces())).build();
            queryResult = primaryCache().get(PROVINCE_CACHE_KEY,() -> super.getFromSecondary(context));
        } catch (ExecutionException e) {
            log.info("{} focus on an exception,then execute queryDB",SHORT_NAME,e);
            queryResult = dictionaryRegFacade.queryProvinces();
            log.info("{} focus on an exception,then execute value={}",SHORT_NAME,JSONObject.toJSONString(queryResult));
        }
        return queryResult;
    }

    /**
     * 查询二级城市
     * @return
     */
    public Result<List<SimpleDistrictRe>> querySecondaryDistricts(){
        if(!useCache()){
            return dictionaryRegFacade.querySecondaryDistricts();
        }
        Result<List<SimpleDistrictRe>> queryResult;
        try {
            CacheContext<Result<List<SimpleDistrictRe>>> context = CacheContext.<Result<List<SimpleDistrictRe>>>builder()
                    .key(SECONDARY_DISTRICT_CACHE_KEY).reference(TypeReferences.SIMPLE_DISTRICT_TYPE).expireSeconds(DEFAULT_EXPIRE_SECONDS)
                    .callback(() -> Optional.ofNullable(dictionaryRegFacade.querySecondaryDistricts())).build();
            queryResult = primaryCache().get(SECONDARY_DISTRICT_CACHE_KEY,() -> super.getFromSecondary(context));
        } catch (ExecutionException e) {
            log.info("{} focus on an exception,then execute queryDB",SHORT_NAME,e);
            queryResult = dictionaryRegFacade.queryProvinces();
            log.info("{} focus on an exception,then execute value={}",SHORT_NAME,JSONObject.toJSONString(queryResult));
        }
        return queryResult;
    }

    /**
     * 查询所有行政列表
     * @return
     */
    public Result<List<SimpleDistrictRe>> queryAll(){
        if(!useCache()){
            return dictionaryRegFacade.queryAll();
        }
        Result<List<SimpleDistrictRe>> queryResult;
        try {
            CacheContext<Result<List<SimpleDistrictRe>>> context = CacheContext.<Result<List<SimpleDistrictRe>>>builder()
                    .key(DISTRICT_CACHE_KEY).reference(TypeReferences.SIMPLE_DISTRICT_TYPE).expireSeconds(DEFAULT_EXPIRE_SECONDS)
                    .callback(() -> Optional.ofNullable(dictionaryRegFacade.queryAll())).build();
            queryResult = primaryCache().get(DISTRICT_CACHE_KEY,() -> super.getFromSecondary(context));
        } catch (ExecutionException e) {
            log.info("{} focus on an exception,then execute queryDB",SHORT_NAME,e);
            queryResult = dictionaryRegFacade.queryAll();
            log.info("{} focus on an exception,then execute value={}",SHORT_NAME,JSONObject.toJSONString(queryResult));
        }
        return queryResult;
    }

    /**
     * 联动查询行政列表
     * @param dto
     * @return
     */
    public Result<List<SimpleDistrictRe>> queryWithGanged(DistrictGangedDTO dto) {
        if(!useCache()){
            return dictionaryRegFacade.queryWithGanged(dto);
        }
        Result<List<SimpleDistrictRe>> queryResult;
        StringBuilder keyBuilder = new StringBuilder(GANGED_CACHE_KEY).append(":").append(dto.getRegLevel());
        if(StringTools.isNotEmpty(dto.getGbCode())) {
            keyBuilder.append(":").append(dto.getGbCode());
        }
        try {
            CacheContext<Result<List<SimpleDistrictRe>>> context = CacheContext.<Result<List<SimpleDistrictRe>>>builder()
                    .key(keyBuilder.toString()).reference(TypeReferences.SIMPLE_DISTRICT_TYPE).expireSeconds(DEFAULT_EXPIRE_SECONDS)
                    .callback(() -> Optional.ofNullable(dictionaryRegFacade.queryWithGanged(dto))).build();
            queryResult = primaryCache().get(keyBuilder.toString(),() -> super.getFromSecondary(context));
        } catch (ExecutionException e) {
            log.info("{} focus on an exception,then execute queryDB",SHORT_NAME,e);
            queryResult = dictionaryRegFacade.queryWithGanged(dto);
            log.info("{} focus on an exception,then execute value={}",SHORT_NAME,JSONObject.toJSONString(queryResult));
        }
        return queryResult;
    }

    @Override
    public Cache<String, Result<List<SimpleDistrictRe>>> primaryCache() {
        return SimpleDistrictCacheFactory.get();
    }

    @Override
    public boolean useCache() {
        boolean useCache = false;
        try {
            useCache = cacheSwitch().simpleDistrictEnable;
            log.info("{} useCache={}",SHORT_NAME,useCache);
        } catch (Exception e) {
            log.error("{} useCache={}",SHORT_NAME,useCache,e);
        }
        return useCache;
    }

    @Override
    public String shortName() {
        return SHORT_NAME;
    }

}

如上述子类SimpleDistrictCacheManager,在实现抽象类相关方法时,并对外部提供的相关方法,譬如Result<List<SimpleDistrictRe>> queryCitiesByParentCode(String parentCode) Result<List<SimpleDistrictRe>> queryProvinces()
我们仔细发现都存在相同的业务动作。

  • 判断是否开启缓存,关闭时从数据库加载。
  • 构建上下文对象CacheContext,然后调用primaryCache().get(x,() -> super.getFromSecondary(context))方法。
  • 而且都通过try…catch…包裹。

分析上述业务动作,这就是明显的模板方法,鉴于此,我们把每个子类共同冗余的模板动作提取到抽象类AbstractCacheManager中。

提取一个公共方法V fromCache(K key,CacheContext<V> context,Supplier<V> dataSourceCaller)如下:

/**
 * 从缓存中获取数据
 * 执行逻辑:
 * (1)、缓存开关关闭时,从 dataSourceCaller 获取。
 * (2)、缓存开关开启时,从一级缓存获取,一级缓存没有则从二级缓存获取。
 * @param key 缓存Key
 * @param context 构建缓存上下文对象
 * @param dataSourceCaller 数据库查找回调器
 * @return
 */
V fromCache(K key,CacheContext<V> context,Supplier<V> dataSourceCaller){
    final String SHORT_NAME = shortName();
    if(!useCache()){
        return dataSourceCaller.get();
    }
    V queryResult;
    try {
        queryResult = primaryCache().get(key,() -> getFromSecondary(context));
    } catch (ExecutionException e) {
        log.info("[{}]ExecutionException,degraded queryDB",SHORT_NAME,e);
        queryResult = dataSourceCaller.get();
        log.info("[{}]ExecutionException,degraded queryDB={}",SHORT_NAME,JSONObject.toJSONString(queryResult));
    }
    return queryResult;
}

上述,既然抽象类AbstractCacheManager<K,HK,V>定义为泛型,其中K为缓存key,HK为缓存小Key,V作为缓存加载的返回值。所以我们根据规约,封装
如上方法,我们使用了一个jdk8中的一个函数,Supplier<T>,该函数通过获取可以拿到我们指定类型的返回值<V>

修改SimpleDistrictCacheManager的方法实现

@Component
@Slf4j
public class SimpleDistrictCacheManager extends AbstractCacheManager<String,String,Result<List<SimpleDistrictRe>>> {

    @Autowired
    DictionaryRegFacade dictionaryRegFacade;
    /**
     * short name
     */
    static final String SHORT_NAME = CacheShortName.simpleDistrictCache.name();
    /**
     * 省份列表缓存key
     */
    static final String PROVINCE_CACHE_KEY = "provinceCache";
    /**
     * 二级行政缓存key
     */
    static final String SECONDARY_DISTRICT_CACHE_KEY = "secondaryDistrictCache";
    /**
     * 行政缓存key
     */
    static final String DISTRICT_CACHE_KEY = "districtCache";
    /**
     * 联动缓存 Key 前缀
     * {0} 行政级别
     * {1} 国标码
     */
    static final String GANGED_CACHE_KEY_PATTERN = "gangedCache:{0}:{1}";
    /**
     * 默认失效时间-2小时(单位秒)
     */
    static final long DEFAULT_EXPIRE_SECONDS = 7200;
    /**
     * 根据父级行政查询下级
     * @param parentCode
     * @return
     */
    public Result<List<SimpleDistrictRe>> queryCitiesByParentCode(String parentCode){
        return fromCache(parentCode,
                buildContext(parentCode,() -> Optional.ofNullable(dictionaryRegFacade.queryCitiesByParentCode(parentCode))),
                () -> dictionaryRegFacade.queryCitiesByParentCode(parentCode));
    }

    /**
     * 查询省份列表
     * @return
     */
    public Result<List<SimpleDistrictRe>> queryProvinces(){
        return fromCache(PROVINCE_CACHE_KEY,
                buildContext(PROVINCE_CACHE_KEY,() -> Optional.ofNullable(dictionaryRegFacade.queryProvinces())),
                () -> dictionaryRegFacade.queryProvinces());
    }

    /**
     * 查询二级城市
     * @return
     */
    public Result<List<SimpleDistrictRe>> querySecondaryDistricts(){
        return fromCache(SECONDARY_DISTRICT_CACHE_KEY,
                buildContext(SECONDARY_DISTRICT_CACHE_KEY,() -> Optional.ofNullable(dictionaryRegFacade.querySecondaryDistricts())),
                () -> dictionaryRegFacade.querySecondaryDistricts());
    }

    /**
     * 查询所有行政列表
     * @return
     */
    public Result<List<SimpleDistrictRe>> queryAll(){
        return fromCache(DISTRICT_CACHE_KEY,
                buildContext(DISTRICT_CACHE_KEY,() -> Optional.ofNullable(dictionaryRegFacade.queryAll())),
                () -> dictionaryRegFacade.queryAll());
    }

    /**
     * 联动查询行政列表
     * @param dto
     * @return
     */
    public Result<List<SimpleDistrictRe>> queryWithGanged(DistrictGangedDTO dto) {
        String cacheKey = MessageFormat.format(GANGED_CACHE_KEY_PATTERN,dto.getRegLevel(),dto.getGbCode());
        return fromCache(cacheKey,
                buildContext(cacheKey,() -> Optional.ofNullable(dictionaryRegFacade.queryWithGanged(dto))),
                () -> dictionaryRegFacade.queryWithGanged(dto));
    }

    /**
     * 构建缓存上下文对象
     * @param cacheKey 缓存key
     * @param supplier 数据库接口查询回调
     * @return
     */
    CacheContext<Result<List<SimpleDistrictRe>>> buildContext(String cacheKey,Supplier<Optional<Result<List<SimpleDistrictRe>>>> supplier){
        return  CacheContext.<Result<List<SimpleDistrictRe>>>builder()
                .key(cacheKey).reference(TypeReferences.SIMPLE_DISTRICT_TYPE).expireSeconds(DEFAULT_EXPIRE_SECONDS)
                .callback(supplier).build();
    }

    @Override
    public Cache<String, Result<List<SimpleDistrictRe>>> primaryCache() {
        return SimpleDistrictCacheFactory.get();
    }

    @Override
    public boolean useCache() {
        boolean useCache = false;
        try {
            useCache = cacheSwitch().simpleDistrictEnable;
            log.debug("{} useCache={}",SHORT_NAME,useCache);
        } catch (Exception e) {
            log.error("{} useCache={}",SHORT_NAME,useCache,e);
        }
        return useCache;
    }

    @Override
    public String shortName() {
        return SHORT_NAME;
    }

}

只需要调用抽象类的 fromCache方法即可,同时在类,进而把CacheContext的对象实例构建提取了一个方法。就是如下:
但是总体上发现这些对外提供的方法清爽简洁了许多(try…catch不见了诶等等)。

/**
 * 构建缓存上下文对象
 * @param cacheKey 缓存key
 * @param supplier 数据库接口查询回调
 * @return
 */
CacheContext<Result<List<SimpleDistrictRe>>> buildContext(String cacheKey,Supplier<Optional<Result<List<SimpleDistrictRe>>>> supplier){
    return  CacheContext.<Result<List<SimpleDistrictRe>>>builder()
            .key(cacheKey).reference(TypeReferences.SIMPLE_DISTRICT_TYPE).expireSeconds(DEFAULT_EXPIRE_SECONDS)
            .callback(supplier).build();
}

2.Supplier

@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}

该函数可以返回指定类型,通过标注@FunctionalInterface,声明该方法支持lambda表达式。
在JDK8之前,我们通过需要new Supplier并实现get()方法,这也就是所谓内部匿名类的实现方式。
而JDK8 lambda就是简化这一冗余的代码,只需要 () -> xx一个代码语义表达即可。

3.总结

其实,JDK,stream api大量通过BiFunctionBiConsumerFunctionPredicateConsummerSupplier函数实现函数式编程,而仔细
查看他们源码,发现都通过@FunctionalInterface标注一个注解,以支持lambda表达式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jdk8 的相关文章

  • yum java8_CentOS8 安装 jdk8 / java8的教程(推荐)

    前言 最开始我是想在CentOS8上使用 wget 下载 xff0c 然后对它进行解压 xff0c 配置环境变量 xff0c 奈何搞了很长时间都没有搞好 xff0c 于是放弃 xff0c 使用yum直接安装 1 安装方法 CentOS8上使
  • Centos7 yum安装jdk8

    执行命令 yum span class token function install span java 1 8 0 openjdk y 安装完成后查看版本号 java version 如果发现安装慢的 xff0c 请参照我之前的博文 xf
  • JDK8新特性:接口的静态方法和默认方法

    https blog csdn net aitangyong article details 54134385 在jdk8之前 xff0c interface之中可以定义变量和方法 xff0c 变量必须是public static fina
  • centos7 yum安装jdk8

    1 安装之前先检查一下系统有没有自带open jdk 命令 xff1a rpm qa grep java rpm qa grep jdk rpm qa grep gcj 如果没有输入信息表示没有安装 2 首先检索包含java的列表 yum
  • debian10 安装jdk8

    下载Oracle JDK 8 在 Debian 上安装 Oracle JDK 需要从官网上下载可供安装的软件包 这里我们使用curl命令来从 Oracle 网站下载 Oracle Java 8 默认情况下curl命令工具并未在系统中安装可以
  • Centos7 安装jdk8

    使用rpm方式安装 1 jdk下载地址 xff1a https www oracle com java technologies downloads java8 2 安装 检测当前系统是否存在java环境 xff01 java versio
  • centos7+jdk8+安装Elasticsearch6.0

    一 xff1a 为Elasticsearch准备用户 1 添加用户 Elasticsearch6 0需要使用非root用户启动 root 64 66 adduser ela root 64 66 passwd ela 2 授权用户 查看文件
  • JDK1.8(jdk8.0)新特性

    Java is still not dead and people are starting to figure that out 本教程将用带注释的简单代码来描述新特性 xff0c 你将看不到大片吓人的文字 一 接口的默认方法 Java
  • jdk8

    文章目录 1 场景再现 2 Supplier
  • JDK8新特性-Function接口与BiFunction接口

    Function 接口 JDK8新增的函数式接口 接口只有一个抽象方法apply 接受一个T类型参数 返回一个R类型参数 T R表示泛型 可以相同 除了一个抽象的apply方法之外 Function存在两个默认的default方法 comp
  • Java虚拟机:关于JDK8到JDK9-10的一点小变化(tools.jar、dt.jar)

    关于JDK8到JDK9 10的一点小变化 JDK在每一次版本升级中 或多或少都会有一些比较重要的变化 或许在你使用的过程中 你就很有可能遇到 一 Removed or Changed APIs JDK8在升级到9或者10的时候 有一些变化还
  • JDK8到JDK17有哪些吸引人的新特性?

    作者 京东零售 刘一达 前言 2006年之后SUN公司决定将JDK进行开源 从此成立了OpenJDK组织进行JDK代码管理 任何人都可以获取该源码 并通过源码构建一个发行版发布到网络上 但是需要一个组织审核来确保构建的发行版是有效的 这个组
  • java8之Stream-Collect操作

    文章目录 collect Collector in Action 收集器 Collectors 常用规约操作 规约到一个单独的值 把数据装进一个list中 将数据收集到一个Set中 把数据收集到一个Map中 Using other coll
  • JDK8安装及系统变量配置(包含错误处理)

    jdk安装 一 下载JDK 二 安装 三 配置系统变量 四 可能遇到的问题 1 显示已经安装的问题 或者 读取注册表项值失败 2 原因 3 解决 五 验证安装成功 一 下载JDK JDK下载官网 二 安装 双击之后 一直下一步就ok 三 配
  • Jdk8 foreach语法需要break怎么办?

    forEach里的return只相当于continue 没有break语法 在这里我总结了3种解决方案供你选择 exception filter anyMatch forEach里的return只相当于continue 没有break语法
  • jdk13快来了,jdk8的这几点应该看看!

    说明 jdk8虽然出现很久了 但是可能我们还是有很多人并不太熟悉 本文主要就是介绍说明一些jdk8相关的内容 主要会讲解 lambda表达式 方法引用 默认方法 Stream 用Optional取代null 新的日志和时间 Completa
  • JDK8 网络Net包研究(一)

    网络基础 1 国际标准化组织的OSI 开放式系统互联模型 七层模型 2 TCP IP协议 组 四层模型 3 TCP IP协议组 一组包括TCP协议和IP协议 UDP协议 ICMP协议和其他一些协议的协议组 网络层 IP协议 gt 网络互连协
  • 将日期字符串转成LocalDateTime

    如果直接用LocalDateTime parse将日期字符串 yyyy MM dd 转成LocalDateTime会导致报错 所以我这里提供了将日期字符串转成LocalDateTime的方法 仅供参考 如有更好方式 欢迎大家分享 impor
  • Lambda表达式使用详细讲解

    目录 1 新思想 1 1函数式编程思想 1 2 函数式接口 2 通往lambda之路 2 1 什么是lambda表示式 2 2 lambda表示式有哪些特点 2 3 lambda表示式使用场景 2 4 lambda表示式语法 2 5 Lam
  • JDK 8 List集合使用记录

    JDK8 的新特性给我们开发带来了很大的便利性 先声明 我没有系统的去学习 JDK8的这些所有新特性 本文只是记录一些我个人日常开发中常遇到的一些 JDK8 的新特性方法 1 提取对象集合中的某一属性集合 List lt 对象 gt gt

随机推荐

  • Matplotlib

    1 折线图 import matplotlib pyplot as plt import numpy as np x np linspace 1 1 50 1到1 有五十个点 y 2 x 1 plt figure num 1 figsize
  • 第1课:三位一体定位法,让写作事半功倍

    做最懂技术的传播者 最懂传播的工程师 课程内容分析 本课程的目标是 通过对一系列问题的梳理 找到适合自己的输出状态 确定与理想输出状态之间存在的差距 以及采取什么办法 减少差距 知识要点 1 受众需要什么 省时间的内容 收敛 看过就走 教你
  • java错误-The prefix "aop" for element "aop:aspectj-autoproxy" is not bound.

    配置springmvc的aop时出错 当我向配置文件中添加
  • 年底裁员潮,你有没有被"N+1"?

    2018年11月28日上午 前一天加班到深夜的李女士 又一大早起床匆匆赶去上班了 她在一家垂直电商公司工作多年 岁末将至 一切和往常一样 为了在年前完成比上一季度更高的 KPI 她所在团队经常通宵达旦赶工 李女士准备开始新一天的鸡血工作 主
  • 数学甜点004

    数学是一门及其高深又变幻莫测的学科 且其根本就是问题的解决 因此是不可能也没有必要去寻找一种能够解决所有问题的通解的 坦白说 研究数学的最大乐趣就是在于发现从来没有人走过的新道路 即一种不同于常规的具有跳跃性 构造性的解法 换句话说 无论是
  • 时序预测

    时序预测 MATLAB实现AR时间序列预测 目录 时序预测 MATLAB实现AR时间序列预测 基本介绍 程序设计 学习总结 参考资料 基本介绍 如果某个时间序列的任意数值可以表示自回归方程 那么该时间序列服从p阶的自回归过程 可以表示为AR
  • 你需要知道面试中的10个JavaScript概念

    翻译原文出处 10 JavaScript concepts you need to know for interviews 之前不是闹得沸沸扬扬的大漠穷秋文章 为什么只会Vue的都是前端小白 甚至大多数回头看了 也就会jQuery和Vue这
  • AI绘画

    今天用Midjourney生成了质量极高的美少女武士后续会作为固定栏目来分享美图接下来请欣赏作品 提示词分享 1 an asian girl dressed in samurai style in the style of anime ae
  • 多维时序

    多维时序 MATLAB实现Attention LSTM 注意力机制长短期记忆神经网络 多输入单输出 目录 多维时序 MATLAB实现Attention LSTM 注意力机制长短期记忆神经网络 多输入单输出 基本介绍 模型背景 LSTM模型
  • error C2041: illegal digit ‘9‘ for base ‘8‘

    错误日志 文本 八进制数值超过范围 1 gt E CProject test12 Source c 5 10 error C2041 illegal digit 8 for base 8 十六进制数值超过范围 1 gt E CProject
  • 【每日一题】ABC194E-Mex Min

    题目内容 原题链接 给定一个长度为 n n n 的整数数组 a a a 求所有长度为 m m
  • 【华为OD统一考试B卷

    题目描述 一群大雁往南飞 给定一个字符串记录地面上的游客听到的大雁叫声 请给出叫声最少由几只大雁发出 具体的 1 大雁发出的完整叫声为 quack 因为有多只大雁同一时间嘎嘎作响 所以字符串中可能会混合多个 quack 2 大雁会依次完整发
  • Spring概述 ——跟我学Spring3

    1 1 1 Spring是什么 Spring是一个开源的轻量级Java SE Java 标准版本 Java EE Java 企业版本 开发应用框架 其目的是用于简化企业级应用程序开发 应用程序是由一组相互协作的对象组成 而在传统应用程序开发
  • 打印机"启用双向支持"的意思

    在打印机的属性选项里面 有一项 启用双向支持 的选项 但是具体有什么作用 一直都不明白 今天特意查了一些资料 启用双向支持 简单来说就是来回打印 打印头从左向右走动时能打印 从右向左回来时不能打印 如果不启用 仅仅是从左向右走动时打印 重庆
  • Illegal processing instruction target ("xml"); xml (case insensitive) is reserved by the specs

    问题描述 当SoapUI访问一个webservice时 对于某些webserive服务 如果webserive的输入参数要求是xml格式 如果xml格式输入不正确 会报 Unmarshalling Error Illegal process
  • 工行数据中心高级经理 李雁南:接口冒烟测试方法

    原文出自 听云技术博客 http blog tingyun com web a 今年遇到了几个问题 与接口的功能和性能相关 恰巧最近公司也在组织以冒烟测试为主题的活动 于是乎突发奇想 寻思着能否将接口测试与冒烟测试结合起来 发掘一些新的接口
  • ICLR 2023

    PaperWeekly 原创 作者 叶振辉 单位 浙江大学博士生 研究方向 语音合成 说话人视频合成 语音驱动的说话人视频合成 Audio driven Talking Face Generation 是虚拟人领域的一个热门话题 它旨在根据
  • linux系统配置文件

    1 etc sysconfig i18n 语言配置文件 2 etc sysconfig network scripts ifcfg eth0 eth0配置文件 3 boot grub grub conf grup配置文件 或 boot gr
  • 【第04例】IPD进阶

    目录 前言 专栏目录 内容详解 IPD 相关专栏推荐 华为流程体系 CSDN学院相关内容
  • jdk8

    文章目录 1 场景再现 2 Supplier