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 的相关文章

  • Centos7安装jdk8

    Centos7安装jdk8 第一种方式 一 使用yum命令本地下载openjdk 1 查看当前是否安装了JDK 查看当前是否安装了JDK xff0c rpm qa grep i jdk 2 如果安装了就直接卸载 rpm ev 参数说明 q在
  • centos7 yum安装jdk8

    1 安装之前先检查一下系统有没有自带open jdk 命令 xff1a rpm qa grep java rpm qa grep jdk rpm qa grep gcj 如果没有输入信息表示没有安装 2 首先检索包含java的列表 yum
  • jdk16正式发布,你还在用jdk8吗?jdk16有啥新特性?下载地址

    新特性 下载地址 官方 xff1a https www oracle com java technologies javase jdk16 downloads html csdn资源windows xff1a https download
  • debian10 安装jdk8

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

    这里纯粹自己弄着玩 xff0c 因为以前没有成功过 xff0c 这里记录一下 xff0c 就是让遇到问题的人可以规避问题 xff0c 快速编译自己的jdk 相信很多学java的人都看过或者了解过一本书 深入理解java虚拟机 xff0c 里
  • Deepin20.5安装JDK8

    1 下载OpenJDK Deepin20 5下安装jdk 这里使用AdoptOpenJDK xff0c 版本8 虚拟机使用HotSplot 首先进入AdoptOpenJDK官网进行下载 xff0c 官方地址为 xff1a https ado
  • Windows JDK8 安装

    Windows JDK8 安装 准备步骤安装完成 准备 准备jdk8 官网下载 xff1a https www oracle com java technologies javase javase jdk8 downloads html 根
  • JDK8新特性(Lambda、Stream、Optional)

    文章目录 1 为什么使用Lambda表达式 xff1f 2 Lambda表达式的使用3 函数式 xff08 functional xff09 接口4 方法引用与构造器引用方法引用的使用构造器引用的使用 5 Stream APIStream
  • centos7+jdk8+安装Elasticsearch6.0

    一 xff1a 为Elasticsearch准备用户 1 添加用户 Elasticsearch6 0需要使用非root用户启动 root 64 66 adduser ela root 64 66 passwd ela 2 授权用户 查看文件
  • 下载JDK8 JVM源码

    性子急的可以直接看快速下载步骤 xff1a 目录 详细步骤快速下载步骤 详细步骤 打开openJDK官网 xff1a https openjdk org 找到左侧的Mercurial xff0c 点击进入新界面 选择jdk8 xff0c 点
  • jdk8-获取本机ip、判断ip范围、ip与long互转等

    在配置nginx的ip白名单时候 xff0c 会通过ip段进行配置 xff08 如 10 10 10 10 24 xff09 就在思考这种配置怎么通过代码解析并判断 xff0c 故通过搜索网络内容 xff0c 并通过java编写测试代码 代
  • JDK8新特性-Function接口与BiFunction接口

    Function 接口 JDK8新增的函数式接口 接口只有一个抽象方法apply 接受一个T类型参数 返回一个R类型参数 T R表示泛型 可以相同 除了一个抽象的apply方法之外 Function存在两个默认的default方法 comp
  • JDK8新特性详解Lambda、StreamAPI、Optional等

    JDK8学习笔记 学习视频地址 https www bilibili com video BV1k64y1R7sA 操作代码 https gitee com rederic study jdk8 git 一 JDK8新特性 1 Lambda
  • JDK8:使用Optional进行变量判空、集合遍历

    防止 NPE 是程序员的基本修养 NPE Null Pointer Exception 一直是我们最头疼的问题 也是最容易忽视的地方 NPE常是导致Java应用程序失败的最常见的原因 在日常研发工作中 经常会处理各种变量 集合 但在使用的过
  • JDK8到JDK17有哪些吸引人的新特性?

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

    1 语言新特性1 1接口新增默认方法与静态方法 1 1 1 Interface Default Method For creating a default method in java interface we need to use de
  • java8之Stream-Collect操作

    文章目录 collect Collector in Action 收集器 Collectors 常用规约操作 规约到一个单独的值 把数据装进一个list中 将数据收集到一个Set中 把数据收集到一个Map中 Using other coll
  • Jdk8 foreach语法需要break怎么办?

    forEach里的return只相当于continue 没有break语法 在这里我总结了3种解决方案供你选择 exception filter anyMatch forEach里的return只相当于continue 没有break语法
  • 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