当前位置: 首页 > news >正文

【CompletableFuture 核心操作全解】详细注释版

一、任务创建操作

1. runAsync() - 执行无返回值的异步任务

/*** 创建并执行无返回值的异步任务* * @param runnable 要执行的任务逻辑(无返回值)* @return CompletableFuture<Void> 表示任务执行状态的Future对象* * 特点:* - 任务在ForkJoinPool.commonPool()中执行* - 完成后future结果为null* - 适合执行后台操作、日志记录等不需要返回值的场景*/
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {System.out.println("执行数据库清理任务...");cleanDatabase(); // 执行耗时清理操作System.out.println("数据库清理完成");
});

2. supplyAsync() - 执行有返回值的异步任务

/*** 创建并执行有返回值的异步任务* * @param supplier 提供返回值的任务逻辑* @return CompletableFuture<T> 包含任务结果的Future对象* * 特点:* - 默认使用ForkJoinPool.commonPool()* - 可指定自定义线程池(第二个参数)* - 适合执行需要返回结果的计算或IO操作*/
CompletableFuture<String> dataFuture = CompletableFuture.supplyAsync(() -> {System.out.println("开始从远程API获取数据...");String result = fetchDataFromAPI(); // 模拟网络请求System.out.println("数据获取完成");return result; // 返回获取的数据
});// 使用自定义线程池
ExecutorService customPool = Executors.newFixedThreadPool(4);
CompletableFuture<Integer> calculationFuture = CompletableFuture.supplyAsync(() -> {System.out.println("在自定义线程池中执行复杂计算...");return heavyCalculation(); // 返回计算结果
}, customPool);

二、结果转换操作

1. thenApply() - 同步转换结果

/*** 同步转换前阶段的结果* * @param function 转换函数(接受前一阶段结果,返回新结果)* @return CompletableFuture<U> 包含转换结果的新Future* * 特点:* - 在前一任务完成线程中同步执行* - 会阻塞完成线程直到转换结束* - 适合快速、非耗时的转换操作*/
CompletableFuture<String> upperCaseFuture = dataFuture.thenApply(rawData -> {System.out.println("同步转换原始数据...");return rawData.toUpperCase(); // 立即执行转换
});// 链式调用示例
CompletableFuture<Integer> lengthFuture = dataFuture.thenApply(String::trim)          // 第一步:去除空格.thenApply(String::length);       // 第二步:计算长度

2. thenApplyAsync() - 异步转换结果

/*** 异步转换前阶段的结果* * @param function 转换函数* @param executor 可选,指定执行转换的线程池* @return CompletableFuture<U> 包含转换结果的新Future* * 特点:* - 在独立线程中执行转换* - 不会阻塞前一任务的完成线程* - 适合耗时较长的转换操作*/
CompletableFuture<Report> reportFuture = dataFuture.thenApplyAsync(rawData -> {System.out.println("在异步线程中生成报告...");return generateReport(rawData); // 耗时报告生成
});// 使用自定义线程池
ExecutorService reportPool = Executors.newFixedThreadPool(2);
CompletableFuture<AnalysisResult> analysisFuture = dataFuture.thenApplyAsync(rawData -> {System.out.println("在专用线程池中执行数据分析...");return analyzeData(rawData); // 复杂数据分析
}, reportPool);

三、结果消费操作

1. thenAccept() - 消费结果(有输入)

/*** 消费前阶段的结果(无返回值)* * @param consumer 消费函数(接受前一阶段结果)* @return CompletableFuture<Void> * * 特点:* - 接收前一阶段结果作为输入* - 不产生返回值* - 适合日志记录、结果存储等操作*/
dataFuture.thenAccept(result -> {System.out.println("消费获取到的数据: " + result.substring(0, 10) + "...");saveToDatabase(result); // 将结果保存到数据库
});

2. thenRun() - 执行操作(无输入)

/*** 在前阶段完成后执行操作(无输入参数)* * @param runnable 要执行的操作* @return CompletableFuture<Void>* * 特点:* - 不接受前阶段结果* - 无输入参数* - 适合执行清理、状态更新等操作*/
dataFuture.thenRun(() -> {System.out.println("数据操作完成,释放资源...");releaseResources(); // 释放使用的资源
});

四、任务组合操作

1. thenCompose() - 链式组合

/*** 链式组合两个异步任务(flatMap)* * @param function 接受前阶段结果,返回新CompletableFuture的函数* @return CompletableFuture<U> 组合后的新Future* * 特点:* - 解决Future<Future<T>>嵌套问题* - 形成异步任务流水线* - 前阶段结果作为下一任务输入*/
CompletableFuture<Integer> userIdFuture = CompletableFuture.supplyAsync(() -> {System.out.println("获取用户ID...");return getUserId(); // 返回用户ID
});// 使用用户ID获取详情
CompletableFuture<User> userDetailFuture = userIdFuture.thenCompose(userId -> {System.out.println("使用用户ID获取详情: " + userId);return getUserDetailAsync(userId); // 返回新的Future
});

2. thenCombine() - 并行组合

/*** 并行组合两个独立任务* * @param other 另一个CompletableFuture* @param bifunction 合并两个结果的函数* @return CompletableFuture<V> 合并结果的新Future* * 特点:* - 等待两个任务都完成* - 合并两个任务的结果* - 适合聚合多个独立操作的结果*/
CompletableFuture<Double> priceFuture = CompletableFuture.supplyAsync(() -> {System.out.println("获取商品价格...");return getProductPrice();
});CompletableFuture<Double> rateFuture = CompletableFuture.supplyAsync(() -> {System.out.println("获取汇率...");return getExchangeRate();
});// 组合两个独立任务的结果
CompletableFuture<Double> localPriceFuture = priceFuture.thenCombine(rateFuture, (price, rate) -> {System.out.println("计算本地价格: " + price + " * " + rate);return price * rate; // 合并计算结果
});

3. acceptEither() - 消费最先完成的结果

/*** 消费最先完成的任务结果* * @param other 另一个CompletableFuture* @param consumer 消费函数* @return CompletableFuture<Void>* * 特点:* - 任一任务完成即触发消费* - 未完成任务继续执行但不处理结果* - 适合快速响应场景*/
CompletableFuture<String> primaryService = queryService("主服务");
CompletableFuture<String> backupService = queryService("备用服务");// 使用最先返回的结果
primaryService.acceptEither(backupService, result -> {System.out.println("使用服务响应: " + result);displayToUser(result); // 向用户显示结果
});

五、多任务协调

1. allOf() - 等待所有任务完成

/*** 等待所有任务完成* * @param futures 多个CompletableFuture* @return CompletableFuture<Void> 所有任务完成时结束* * 特点:* - 所有任务完成时返回* - 需要手动获取各任务结果* - 适合聚合多个异步操作结果*/
CompletableFuture<String> task1 = supplyAsync(() -> "结果1");
CompletableFuture<String> task2 = supplyAsync(() -> "结果2");
CompletableFuture<String> task3 = supplyAsync(() -> "结果3");CompletableFuture<Void> allFutures = CompletableFuture.allOf(task1, task2, task3);// 所有任务完成后处理
allFutures.thenRun(() -> {// 使用join()获取结果(不会抛受检异常)String result1 = task1.join();String result2 = task2.join();String result3 = task3.join();System.out.println("所有任务完成,聚合结果: " + result1 + ", " + result2 + ", " + result3);
});

2. anyOf() - 等待任一任务完成

/*** 任一任务完成即返回* * @param futures 多个CompletableFuture* @return CompletableFuture<Object> 包含首个完成的结果* * 特点:* - 返回Object类型结果(需类型转换)* - 未完成任务继续执行* - 适合竞态条件场景*/
CompletableFuture<String> cacheQuery = queryCache();
CompletableFuture<String> dbQuery = queryDatabase();CompletableFuture<Object> firstResult = CompletableFuture.anyOf(cacheQuery, dbQuery);firstResult.thenAccept(result -> {// 需要显式类型转换String data = (String) result;System.out.println("最先返回的结果: " + data);
});

六、异常处理

1. exceptionally() - 异常恢复

/*** 捕获异常并返回替代值* * @param function 异常处理函数* @return CompletableFuture<T> 包含正常结果或替代值的新Future* * 特点:* - 仅在前阶段异常时触发* - 可以恢复为正常结果* - 相当于catch块*/
CompletableFuture<Integer> riskyFuture = CompletableFuture.supplyAsync(() -> {if (Math.random() > 0.5) {throw new RuntimeException("随机错误");}return 42;
});CompletableFuture<Integer> safeFuture = riskyFuture.exceptionally(ex -> {System.err.println("捕获异常: " + ex.getMessage());return 0; // 提供默认值
});

2. handle() - 双结果处理

/*** 处理正常结果和异常* * @param bifunction 接受结果和异常的处理函数* @return CompletableFuture<U> 处理后的新Future* * 特点:* - 无论成功失败都会执行* - 可同时访问结果和异常* - 必须返回新结果*/
CompletableFuture<String> apiCall = fetchFromAPI();CompletableFuture<String> processed = apiCall.handle((result, ex) -> {if (ex != null) {System.err.println("API调用失败: " + ex.getMessage());return "默认数据"; // 异常时返回默认值}return "处理后的: " + result.toUpperCase(); // 正常时转换结果
});

3. whenComplete() - 完成回调

/*** 完成时回调(不改变结果)* * @param biconsumer 接受结果和异常的回调函数* @return CompletableFuture<T> 保留原始结果的新Future* * 特点:* - 类似finally块* - 可访问结果或异常* - 不影响原始结果*/
dataFuture.whenComplete((result, ex) -> {if (ex != null) {System.err.println("数据处理失败: " + ex.getMessage());metrics.recordFailure();} else {System.out.println("数据处理成功,长度: " + result.length());metrics.recordSuccess();}
});

七、完成控制(Java 9+)

1. completeOnTimeout() - 超时默认值

/*** 超时提供默认值* * @param value 默认值* @param timeout 超时时间* @param unit 时间单位* @return CompletableFuture<T> * * 特点:* - 超时后自动完成并返回默认值* - 原始任务继续执行但结果被忽略* - 避免无限期等待*/
CompletableFuture<String> slowService = callSlowService();CompletableFuture<String> withTimeout = slowService.completeOnTimeout("超时默认值", 2, TimeUnit.SECONDS);

2. orTimeout() - 超时异常

/*** 超时抛出异常* * @param timeout 超时时间* @param unit 时间单位* @return CompletableFuture<T> * * 特点:* - 超时后抛出TimeoutException* - 可配合exceptionally处理* - 强制设置最大等待时间*/
CompletableFuture<String> serviceCall = externalService().orTimeout(500, TimeUnit.MILLISECONDS).exceptionally(ex -> {if (ex.getCause() instanceof TimeoutException) {return "超时回退值";}return "其他错误回退值";});

八、完成状态操作

1. complete() - 手动设置结果

/*** 手动设置结果值* * @param value 要设置的结果* @return boolean 是否设置成功(如果已完成返回false)* * 特点:* - 强制完成future* - 唤醒所有等待线程* - 如果已完成则无效*/
CompletableFuture<String> manualFuture = new CompletableFuture<>();// 外部线程完成
new Thread(() -> {try {String result = computeResult();boolean set = manualFuture.complete(result);System.out.println("手动设置结果: " + set);} catch (Exception e) {manualFuture.completeExceptionally(e);}
}).start();

2. completeExceptionally() - 手动设置异常

/*** 手动设置异常* * @param ex 要设置的异常* @return boolean 是否设置成功* * 特点:* - 以异常状态完成future* - 触发异常处理链* - 模拟服务失败场景*/
CompletableFuture<String> simulatedFailure = new CompletableFuture<>();// 模拟失败
simulatedFailure.completeExceptionally(new RuntimeException("模拟异常"));simulatedFuture.exceptionally(ex -> {System.out.println("捕获模拟异常: " + ex.getMessage());return "回退值";
});

操作对比总结表

操作类型 方法名 特点 适用场景 线程行为
任务创建 runAsync 无返回值 后台任务、清理操作 异步执行
supplyAsync 有返回值 数据获取、计算任务 异步执行
结果转换 thenApply 同步转换 快速转换、数据预处理 使用前一任务线程
thenApplyAsync 异步转换 耗时操作、IO处理 使用新线程
结果消费 thenAccept 消费结果 结果存储、日志记录 使用前一任务线程
thenRun 无参操作 资源清理、状态更新 使用前一任务线程
任务组合 thenCompose 链式组合 任务流水线、依赖操作 使用前一任务线程
thenCombine 并行组合 聚合独立任务结果 使用前一任务线程
acceptEither 消费首个结果 竞速服务、降级策略 使用完成任务的线程
多任务 allOf 等待所有 批量处理、聚合数据 任意完成线程
anyOf 等待任一 快速响应、超时处理 首个完成线程
异常处理 exceptionally 异常恢复 提供默认值 异常发生线程
handle 双结果处理 统一处理成功/失败 使用前一任务线程
whenComplete 完成回调 资源清理、指标记录 使用前一任务线程
完成控制 complete 手动设值 外部控制、测试模拟 调用者线程
completeExceptionally 手动设异常 模拟失败、错误注入 调用者线程

关键执行机制详解

1. 线程传递规则

  • 非Async方法:在前一阶段的任务线程中同步执行
  • Async方法:默认在ForkJoinPool.commonPool()执行
  • 带Executor参数的Async方法:在指定线程池执行

2. 结果传递流程

graph TDA[任务完成] --> B{是否有依赖操作}B -->|有| C[触发依赖动作]C --> D[创建新阶段]D --> E[存储结果]E --> F[触发下一依赖]B -->|无| G[保存结果待后续访问]

3. 异常传播机制

  • 异常会沿调用链向后传播
  • 直到遇到exceptionally()或handle()处理
  • 未处理的异常会导致整个链失败
  • whenComplete()可访问异常但不处理

4. 依赖管理策略

  • 使用栈结构存储依赖关系
  • 完成后按后进先出(LIFO)顺序触发
  • 保证依赖链的有序执行
  • 避免嵌套过深导致的栈溢出问题

掌握这些核心操作的详细用法和执行特性,能够帮助开发者构建高效、健壮的异步处理系统,有效管理复杂的异步任务编排。

相关文章:

【CompletableFuture 核心操作全解】详细注释版

一、任务创建操作 1. runAsync() - 执行无返回值的异步任务 /*** 创建并执行无返回值的异步任务* * @param runnable 要执行的任务逻辑(无返回值)* @return CompletableFuture<Void> 表示任务执行状态的Future对象* * 特点:* - 任务在ForkJoinPool.commonPool()中执行…...

关于学术不端的一些思考

前言 由图书馆性骚扰事件,牵扯出学术不端行为,最后撤销硕士学位。正应了那句“来说是非者,便是是非人”。学术不端 中华人民共和国学术不端问题包括论文抄袭、洗稿、代写、造假、买卖、学历学位认证失信行为、掠夺性开放获取出版、批量引进海外“速成博士”等。 国际上一般指…...

python基础-字典

字典:以键值对的方式存储 { key: value, key2:value2} 初始化空字典: dict2 = {} 或者dict3 = dict() 字典的常见操作:1.增加 dict1[id] = 1101 如果key = id不存在,则新增key和value对应的键值对; 如果key = id的已存在,则修改覆盖key = id对应的value的值2.删除del …...

pod 内nslookup请求时常异常

pod 内nslookup请求时常异常 现象原因 装机模板中在 /etc/resolv.conf 添加了 search tbsite.net 。 kubelet clusterfist 会自动将宿主机的 search 追加到 search default.svc.cluster.local svc.cluster.local 之后。 解决方式 清理 node 上的 search 记录。业务 pod 需要重启…...

单调队列优化DP

董晓一系列都可以做下来 https://www.bilibili.com/video/BV19X4y1m7Sb dp题单 https://www.luogu.com.cn/training/853282...

4.5.11版本闪亮登场~快来看看有哪些新功能

产品更新概览 功能修复: 修复检测更新失败问题; 修复iframe组件存放文件夹无法打开问题; 修复二维地图部分场景加载失败问题; 修复项目发布后无法获取数据问题; 修复访客免验证登录校验问题。 功能优化: 优化数据刷新逻辑; 鲸孪生标记性能优化; 图标组件性能优化; 优化…...

教你数分钟内创建并运行一个 DolphinScheduler Workflow!

本文就主要探讨如何在 ApacheDolphinScheduler 上更好地玩转 Workflow, 以帮助大家更好地管理数据处理任务。Workflow是什么? 对于数仓场景和数据湖场景来说,最显著的特点就是数据处理的长流程和高复杂度任务依赖关系,从源数据采集到最终报表数据的生成,中间可能经历上百个…...

AT_agc065_b [AGC065B] Erase and Insert

倒过来看,每次将 \(p\) 中 \(i\) 随便放到一个位置,那么在放 \(i\) 之前,你需要保证 \(1 \sim i - 1\) 的相对顺序递增,然后就可以 DP 了。 另外一种做法是题解区第一篇。...

《大模型时代——智能体的崛起与应用实践(微课视频版)》

在人类技术演进的长河中,人工智能(Artificial Intelligence,AI)无疑是最具革命性的篇章之一。随着科技的飞速发展,人类迎来了一个全新的纪元—大模型时代。本章旨在深入剖析这一时代的内涵,从大模型的基本概念出发,探索其发展历程,关键技术要素,核心价值,以及支撑其发…...

第三节:GoLangChain提示词(Prompts)处理详解

在使用大语言模型(LLM)时,提示词(Prompt)是与模型交互的关键。良好的提示词设计能够显著提升模型输出的质量。本文将基于langchaingo库,详细介绍Go语言中处理提示词的几种主要方式。 1. 引言在与大语言模型交互时,提示词的设计至关重要。LangChain框架提供了一套完整的提示词…...

rhel8 中vdo 邏輯卷的邏輯擴容

物理盤 = 500G vdo size = 2000G 擴容到5000Gumount /home/repo vdo stop --name=vdo01 vdo growLogical --name=vdo01 --vdoLogicalSize=5000Gdf --human-readable /home/repoxfs_growfs /dev/mapper/vdodf --human-readable /home/repovdostats --human...

Codeforces Round 1051 (Div. 2) 部分题解

D E F 题解Codeforces Round 1051 (Div. 2) 部分题解 D - Inversion Graph Coloring 理解成二分图,图中没有奇环,等价于序列不存在 \(i<j<k\) 使得 \(a_i>a_j>a_k\) 。 设 \(f_{i,x,y}\) 表示前 \(i\) 个数,当前序列最大值为 \(x\) ,下一个不能取小于 \(y\) 的…...

kingbase金仓数据库的密码有效期和密码复杂度

Kingbase金仓数据库提供了密码有效期和复杂度配置功能,可以通过以下方式进行设置: 一. 密码有效期配置 插件identity_pwdexp identity_pwdexp是KingbaseES的一个扩展插件,用于设置口令有效期。 KingbaseES的用户管理中含有口令有效期这一属性,用户密码过期检查就是通过设置…...

HDF5文件

掌握HDF5文件:先理解核心结构(打基础),再学C#读写库(搭环境),最后实战读写操作(练手)。 全程结合代码示例,确保新手能跟上。 阶段1:先搞懂HDF5文件的核心结构(必须先理解!) HDF5(Hierarchical Data Format 5)是一种分层结构的二进制文件格式,专门用于存储和管…...

Error encountered when performing Introspect the Portion of idea Introspect using JDBC metadata在哪设置

Error encountered when performing Introspect the Portion of 最新解决方案&新版本idea Introspect using JDBC metadata在哪设置?前言 使用idea2025专业版(MAC)连接mySQL后无法显示表结构,并且报错 Error encountered when performing Introspect the Portion of 1 …...

核桃 CSP-S 模拟

核桃 CSP-S 模拟 T3 题意: 给定一个 \(01\) 串,选定一个操作序列,每次从原串中删除一个数,保持原串中相对顺序不变,把形成的新字符串加入答案字符串,求出本质不同答案字符串总数。 其中 \(n\le 400\) 思路: 我们不妨把题意转化一下,对于每一个节点赋值 \(t_i\) 表示 \(…...

正确输入连字号、连接号、破折号和负号

转载:Pigman - 博客园: 正确输入连字号、连接号、破折号和负号论文书写和报告编制中,经常出现连字号、连接号、破折号和负号的混淆使用,既不符合规范也影响文档美观。下面对这组符号进行区分,并给出word下正确输入方法。连字号 (Hyphen),[-] 1) 英语中的复合词,…...

9 月记录

P13644 K-LCA 给出树和 \(k\),每次询问给出区间 \([l,r]\),找到选择 \(k\) 个区间内的点使得 LCA 深度最大。 \(n,q\le 10^5,1<k\le n\)。考虑回滚莫队,每次加入一个点,二分最深的子树个数 \(\ge k\) 的祖先,可以做到两个 \(\log\)。 考虑树链剖分,标号是先标号轻儿子…...

python基础-元组

元组: 一个元组可以存储多个数据,切元组内的数据是不可更改 t1 = (10,20,30)t2 = (10,)t3 = 10, 元组操作:元组不支持修改,只支持查找tuple.index()访问:下标访问: tuple[index]统计某项元素出现的次数: tuple.count(item)元组的长度: length = len(tuple)目标元素的位置…...

.net core中获得程序集以及注入框架的方法总结

虚方法public class Animal { // 虚方法 public virtual void MakeSound() { Console.WriteLine("动物发出声音"); } }public class Dog : Animal { // 重写虚方法 public override void MakeSound() { Console.WriteLine("汪汪汪!"); } }var sss = Assem…...

python基础篇-list(列表)

list:列表中可以一次性存储多个数据,且数据项的类型可以不同 常见操作:1.查找下标访问,查找某个位置的数据项: list[index]查找某个数据项首次出现的下标: list.index[item, 开始位置下标, 结束位置下标];如果存在则返回出现位置下标,如果不存在,则报错出现的次数: li…...

vscode使用powershell中文乱码

VSCode使用终端中文乱码 原因: vscode编辑文本默认使用utf-8,但是windows的终端默认使用gbk(简体中文)编码。utf-8采用1-4位记录一个字符,其中中文采用3位。gbk采用两位记录一个中文字符。所以中文显示乱码。 解决方案:先确认终端是中文编码,在终端输入chcp,若输出936表…...

关于如何读懂 P11832 [省选联考 2025] 图排列?

题面太形式化了! 我!根!本!读!不!懂! 这题想要拿分必须转化题面。 初步转化 他只给了我们 \((p_{a_i},p_{b_i})\),然后让我们去找最小的 \(p\)? 没给我 \(a_i,b_i\)?\(a_i,b_i\) 不用刻意构造出来,我们只需要时刻保证 \(a_i,b_i\) 的限制就可以了。 假设我们拿到了最…...

Untitled

Untitled展开思考过程 Hinted 3/5 似乎没有性质,因此考虑做一步转化。 考虑一个点若被同种边通过大于 2 次,那么 必然有一次没有用,考虑每条边可以是区间 +1 或者是区间 -k(k 足够大),要求最终每个点 <0 并且绝对值不是 k 的倍数 让我想到同余最短路,但是我们可以考虑…...

敏感性分析

什么是敏感性分析? 数学模型只是实际问题的一个粗略的抽象,最优解也只是针对某一特定的数学模型。管理者要对未来做各种假设,在这些假设下,测试可能产生的结果,通过对各种结果深入分析来指导决策。通常,在取得最初版本模型的最优解之后,进行分析 才能取得对问题深入的认…...

完整教程:论园区电气安全管理系统的重要性

完整教程:论园区电气安全管理系统的重要性pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impo…...

基于CSU8RP1186芯片的握力器解决方案

握力器方案采用高精度传感器、ADC芯片和先进的数据处理技术,可将物体的重量以千克和磅为单位进行准确测量和记录,其原理是通过在称重时,握力器传感器的金属构架受力形变,贴片上的金属丝也随着被拉长或缩短,金属丝电阻因此改变,通过测量金属丝的电阻变化,得到所称重物的数…...

亮相2025年服贸会,天翼云打造高质量算力服务新生态!

近日,2025年中国国际服务贸易交易会(简称服贸会)在北京隆重举行。本届服贸会以“数智领航,服贸焕新”作为年度主题,顺应服务贸易数字化、智能化、绿色化趋势,聚焦人工智能、医疗健康、智慧物流、商旅文体健融合发展等专业领域,展示多个国家和地区的创新发展成果。天翼云…...

易路薪酬专家Agent:基于10亿级数据与AI的智能薪酬解决方案

导读: 在AI深度赋能人力资源管理的趋势下,薪酬模块的智能化已成为企业提升人效与战略决策的关键。本文深度解析易路人力资源科技公司最新推出的人才薪酬专家Agent,重点介绍其基于10亿级动态市场数据与多智能体协同(市场数据Agent、薪酬诊断Agent、竞品招聘动态Agent)的核心…...

有点意思!Java8后最有用新特性排行榜!

相信这两天看了 JDK 25 新特性的同学已经彻底对 Oracle 失望了,这那是挤牙膏啊?是连牙膏都懒得挤了。 所以,大家都在评论区喊话,如果你(Oracle)实在不想发可以不发,但不要糊弄大家。 那么,今天呢。我也把从 JDK 8 之后的长期支持版:JDK11、JDK17、JDK21、JDK25 的新特…...

数据结构 Trick 之:KDT 求 k 近/远 点

注意,此 Trick 的时间复杂度是错的,但是貌似目前没人能卡满。 能够解决的问题\(O(n \sqrt n)\) 可过。 维护二维平面。 每次求到一个点的 \(k\) 近或 \(k\) 远点。 \(k\) 很小(\(20\) 左右)思路 二维空间想到 KDTree(TreeKevin Durant Tree)。 众所周知,动态维护 \(k\) …...

.NET 8程序配置版本及产品信息

一、给主程序单独添加配置 1、双击主程序,会打开主程序的.csproj文件,在PropertyGroup下添加 <Company>Your Company</Company><Product>Your Product</Product><Version>1.2.3</Version><FileVersion>1.2.3.0</FileVersion…...

C语言第二讲:进制转化

C语言中进制转化的符号表示进制 数据类型 赋值格式二进制 %0b a=0b1010八进制 %o a=03344十进制 %d a=1234十六进制 %x/%X a=0x34a5 / 0X43D6输出时转化: int a=100; printf("%o",a); 赋值时转化: int a; a=03355//赋值为八进制数...

XXL-JOB(4)

XXL-JOB(4)分片任务 分片任务能更好的利用集群的能力,可以同时调度多个机器并行运行任务。分片任务的实现原理包括以下几个核心步骤:1、任务分配当一个分片任务被触发时,调度器会根据任务的分片参数决定需要多少个执行器参与任务。每个执行器或执行线程会接收到一个分片索…...

QOJ #10485. Peculiar Protocol 题解

Description 你有一个序列 \(a_1, a_2, \dots, a_n\),以及两个参数 \(d, r\)。 你可以做如下操作若干次:每次选择一段区间,使得他们的和可以被表示成 \(k \times d + r\) 的形式,其中 \(k\) 是一个非负整数。 你把 \(k\) 加入分数中,然后在序列中删去这一段,剩下的序列合…...

C++ 常用关键字

1. static 控制作用域、生命周期或类成员归属 // 1. 全局/命名空间:仅当前文件可见(避免跨文件重定义) static int global_static = 10; // 其他文件无法通过 extern 访问// 2. 局部变量:生命周期延长至程序结束(仅初始化1次) void counter() {static int cnt = 0; cnt++…...

【AP出版】第四届数理统计与经济分析国际学术会议 (MSEA 2025)

第四届数理统计与经济分析国际学术会议 (MSEA 2025)将于2025年12月05-07日在中国广州召开。【高录用快见刊:最快一周内即可录用,会后3-4个月见刊】 【征稿范围:数理统计、经济分析大方向主题均可收稿】 第四届数理统计与经济分析国际学术会议 (MSEA 2025) 2025 4th Internat…...

数据结构 Trick 之:区间子区间计数

能够解决的问题\(O(n \log n)\) 可过。 维护数列,无修改,每次查询一个区间的所有子区间。 离线思路 看到一个区间的所有子区间这种查询,直接做显然是做不了的。 考虑离线,那么将询问区间进行右端点排序,然后就可以扫描线搞掉一维。 我们从左往右枚举 \(r\) 维护线段树 \(t…...

mapstruct.Mapper|Mapping详解

------------------------------------------------------------------------------------------ org.mapstruct.Mapper 和 org.mapstruct.Mapping 是 MapStruct 框架中的核心注解,用于实现 Java 对象之间的自动映射。MapStruct 是一个代码生成器,通过注解配置生成类型安全、…...

抽象代数-学习笔记

主要积累一些遇到的例子、题目。不定时更新。 运算有结合律的运算:普通/复数/矩阵/模意义下加法、乘法,映射复合,与或异或/集合相关, min/max。 仅仅满足部分群公理:\(\mathbb{N}^*, \mathbb{N}\)。\(\{0,1,2\}\) 上可构造有单位元、有逆元但无结合律的运算。 域的性质仅仅…...

如何在保证质量的前提下,快速完成一份 PPT?

这是一个非常经典且普遍的问题,尤其对于产品经理、咨询顾问等角色来说,PPT既是生产力工具,也是时间吞噬黑洞。你能意识到这个问题并寻求解决方案,已经领先了很多人。 在保证质量的前提下快速完成PPT,绝非单纯追求“手速”,而是一套系统工程,涉及工作流程、工具链、方法论…...

Source Code Summarization in the Era of Large Language Models 论文笔记

介绍 (1) 发表:ICSE25 (2) 背景 之前的研究表明,与传统的代码摘要模型相比,LLM 生成的摘要在表达方式上与参考摘要有很大不同,并且倾向于描述更多的细节。因此,传统的评估方法是否适合评估 LLM 生成摘要的质量仍然未知 (3) 贡献 受到 NLP 工作的启发,本文对使用 LLM 本身…...

线性回归-入门案例

使用公开的房价数据集进行预测,数据包含8个特征1个目标值 特征最多使用2次幂代码示例 import numpy as np import pandas as pd from sklearn.datasets import fetch_california_housing from sklearn.linear_model import LinearRegression from sklearn.metrics import mean…...

XXL-JOB(3)

XXL-JOB(3)开发Bean模式(基于方法)Bean模式任务,支持基于方法的开发方式,每个任务对应一个方法。基于方法开发的任务,底层会生成JobHandler代理,和基于类的方式一样,任务也会以JobHandler的形式存在于执行器任务容器中。优点:每个任务只需要开发一个方法,并添加”@Xxl…...

ClickHouse 表引擎深度解析:ReplacingMergeTree、PARTITION、PRIMARY KEY、ORDER BY 详解 - 若

ClickHouse 表引擎深度解析:ReplacingMergeTree、PARTITION、PRIMARY KEY、ORDER BY 详解 前言 ClickHouse 作为高性能的列式数据库,其表引擎设计是其核心优势之一。ReplacingMergeTree 是处理重复数据的利器,而 PARTITION、PRIMARY KEY、ORDER BY 等配置直接影响查询性能和…...

UOS统信服务器操作系统V20(1070)安装mysql8.4.5(建议安装glibc2.28版本)

环境:OS:UOS Server 20 统信服务器操作系统V20(1070)mysql:8.4.5 glib.2.17 操作系统下载https://www.chinauos.com/resource/download-server查看系统glibc版本[root@localhost yum.repos.d]# ldd --versionldd (GNU libc) 2.28Copyright (C) 2018 Free Software Foundation, …...

web5(phps源码泄露)

访问index.phps,会自动下载index.php文件 点击查看即可得到flag...

web3(自带网络工具包查看数据)

查看源码什么也没有扫目录也什么都没有只能说信息收集能力还欠佳, 我们可以先尝试使用浏览器自带的网络工具查看一下数据包。...

web17(备份的sql文件泄露)

用常见的数据库工具打开即可...

web11(通过Dns检查查询Flag)

:::info 223.5.5.5测试的解析结果是否具有代表性?(来自阿里云官网)具备一定的代表性,在国内客户端使用223.5.5.5有一定的用户群体,但是该测试结果并不能代表全部用户;如果223.5.5.5测试已经生效,但是您本地仍然不能访问,那么可以侧面反映至少使用223.5.5.5的Local DNS用户…...