優秀工具包-Hutool工具詳解

優秀工具包-Hutool工具詳解

課程概述

Hutool簡介

  • 定位:

    • 小而全的Java工具庫,簡化開發流程。
    • 對文件、流、加密解密、轉碼、正則、線程、XML等JDK方法進行封裝。
  • 核心優勢:零依賴、高性能、中文網頁完善。

  • 應用場景:Web開發、數據處理、加密解密等。

課程目標

  • 掌握Hutool核心模塊的使用方法
  • 理解工具類設計哲學與最佳實踐
  • 實現常見開發場景的快速編碼

核心模塊詳解

集合操作

集合創建與判空

傳統方式

// 創建集合
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");// 集合判空
if(list == null || list.isEmpty()) {System.out.println("集合為空");
}

Hutool方式

// 一行代碼創建集合
List<String> list = CollUtil.newArrayList("a", "b", "c"); //newHashSet// 安全的判空方法
if(CollUtil.isEmpty(list)) {System.out.println("集合為空");
}

優勢

  • 集合初始化代碼量減少70%
  • 避免NPE風險
  • 代碼可讀性更強
集合分組
[Emp(name=趙六, dept=技術部, age=23)]
[Emp(name=李四, dept=產品部, age=23), Emp(name=王五, dept=產品部, age=23)]

傳統方式

// 分組
Map<String, List<Emp>> groupedMap = new HashMap<>();
for (Emp emp : employees) {String dept = emp.getDept();if (!groupedMap.containsKey(dept)) {groupedMap.put(dept, new ArrayList<>());}groupedMap.get(dept).add(emp);
}
// 轉換
List<List<Emp>> list = new ArrayList<>();
for (List<Emp> empList : groupedMap.values()) {list.add(empList);
}

Hutool方式

List<List<Emp>> list = CollUtil.groupByField(employees, "dept");

優勢

  • 代碼量減少80%
  • 避免手動處理分組邏輯
  • 支持按字段名分組
集合過濾

傳統方式

// 過濾
List<Emp> filtered = new ArrayList<>();
for (Emp emp : employees) {if (emp.getAge() > 30 && "研發部".equals(emp.getDept())) {filtered.add(emp);}
}

Hutool方式

List<Emp> filtered = CollUtil.filter(employees, emp -> emp.getAge() > 30 && "研發部".equals(emp.getDept()));

優勢

  • 使用Lambda表達式更簡潔
  • 鏈式調用更流暢
  • 可讀性更好

IO流 & 文件操作

文件讀取

傳統方式

/*** 讀取文件所有行內容(傳統JDK方式)* @param filePath 文件路徑* @return 行內容列表*/
public List<String> readFileTraditional(String filePath) {List<String> lines = new ArrayList<>();BufferedReader br = null;try {// 1. 創建緩沖讀取器br = new BufferedReader(new FileReader(filePath));String line;// 2. 按行讀取并放入集合while ((line = br.readLine()) != null) {lines.add(line);}} catch (IOException e) {// 4. 異常處理System.err.println("讀取文件失敗: " + e.getMessage());e.printStackTrace();} finally {// 5. 關閉資源(需要嵌套try-catch)try {if (br != null){br.close();}} catch (IOException e) {System.err.println("關閉流失敗: " + e.getMessage());}}return lines;
}

傳統方式的問題

  • 需要手動管理流對象
  • 異常處理代碼占整體代碼量的50%以上
  • 資源關閉需要嵌套try-catch,容易遺漏
  • 不支持指定字符編碼(默認使用系統編碼)
  • 代碼行數20多,實際業務邏輯只有5行

Hutool方式

/*** 讀取文件所有行內容(Hutool方式)* @param filePath 文件路徑* @return 行內容列表*/
public List<String> readFileByHutool(String filePath) {// 指定UTF-8編碼讀取(自動關閉資源)return FileUtil.readLines(filePath, CharsetUtil.UTF_8);
}

優勢

  • 代碼量減少70%
  • 指定字符編碼更簡單
  • 自動關閉資源
文件拷貝

傳統方式

try (InputStream in = new FileInputStream("source.txt");OutputStream out = new FileOutputStream("target.txt")) {byte[] buffer = new byte[1024];int length;while ((length = in.read(buffer)) != -1) {out.write(buffer, 0, length);}
} catch (IOException e) {e.printStackTrace();
}

Hutool方式

FileUtil.copy("source.txt", "target.txt", true);// true 如果目標文件已存在,則覆蓋它

優勢

  • 代碼量減少90%
  • 自動處理資源關閉
  • 支持覆蓋選項
關閉流

傳統方式:

try {if (stream != null) {stream.close();}
} catch (IOException e) {e.printStackTrace();
}

Hutool方式

IoUtil.close(stream);

如果用上面傳統方式的編碼進行關閉流的實現,當第三方機構對代碼進行安全掃描時,就不能通過。

流轉換為字符串

傳統方式

// 將inputStream流中的內容讀取出來并使用String接收
StringBuilder sb = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))
){String line;while ((line = reader.readLine()) != null) {sb.append(line);}
} catch (IOException e) {e.printStackTrace();
}
String content = sb.toString();

Hutool方式

String content = IoUtil.read(inputStream, StandardCharsets.UTF_8);

優勢

  • 代碼量減少80%
  • 自動處理字符編碼
  • 自動關閉資源

JDK8時間API增強

日期格式化與解析

傳統方式

// 格式化
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDate = now.format(formatter); // "2025-08-09 14:30:45"// 解析
String dateStr = "2025-08-09 14:30:45";
LocalDateTime parsedDate = LocalDateTime.parse(dateStr, formatter);

Huto增強方式

// 格式化
String str = LocalDateTimeUtil.format( LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss");
// 或使用預定義格式
String str = LocalDateTimeUtil.format(now, DatePattern.NORM_DATETIME_PATTERN);// 解析
LocalDateTime date = LocalDateTimeUtil.parse("2023-08-20 14:30:45","yyyy-MM-dd HH:mm:ss");

優勢

  • 內置線程安全的格式化器緩存
  • 支持DatePattern中所有標準格式
  • 更簡潔的API
日期比較

傳統方式:

LocalDateTime startTime = LocalDateTime.of(2025,8,1,0,0,0);
LocalDateTime endTime = LocalDateTime.of(2025,8,30,23,59,59);
LocalDateTime now = LocalDateTime.now();// 判斷當前時間是否在指定的區間內
boolean isInRange = now.isAfter(startTime) && now.isBefore(endTime);

Hutool增強方式

boolean isIn = LocalDateTimeUtil.isIn(now, start, end);  // 是否在區間內
日期范圍

傳統方式:

// 獲取當天開始時間(2025-08-10 00:00:00)
LocalDateTime todayStart = LocalDateTime.now()          // 當前時間.truncatedTo(ChronoUnit.DAYS);                     // 截斷到天
// 獲取當天結束時間(2025-08-10 23:59:59)
LocalDateTime todayEnd = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)  // 截斷到天.plusDays(1)                   // 加一天.minusNanos(1000000);     	   // 減去一毫秒(1000000納秒)

Hutool增強方式:

// 獲取當天的起始時間 
LocalDateTime dayStart = LocalDateTimeUtil.beginOfDay(LocalDate.now()); // 5.8.28版本
LocalDateTime dayStart = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
// 獲取當天結束時間
LocalDateTime dayEnd = LocalDateTimeUtil.endOfDay(LocalDateTime.now());

擴展:

Date 轉 LocalDateTime

Date date = new Date();     
LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();// Hutool寫法
LocalDateTime localDateTime = DateUtil.toLocalDateTime(date);

Date 轉 LocalDate

Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

Date轉LocalTime

Date date = new Date();
// 轉換為 LocalDateTime
LocalTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().toLocalTime();

LocalDateTime 轉 LocalDate

LocalDateTime localDateTime = LocalDateTime.now();
LocalDate localDate = localDateTime.toLocalDate();

序列化操作

JSON序列化與反序列化

傳統方式(Jackson)

若完全基于Jdk提供的原生API去實現序列化,生成的數據是二進制格式,不是人類可讀的JSON格式。這里不做展示。

Hutool方式

// 將Student對象轉成json字符串
String json = JSONUtil.toJsonStr(student);
// 將json字符串轉成Student對象
Student student = JSONUtil.toBean(json, Student.class);// 將List<Student>轉成json字符串
ArrayList<Student> students = CollUtil.newArrayList(new Student("張三", 18, List.of("java", "python", "c++")),new Student("李四", 18, List.of("java", "python", "c++")),new Student("王五", 18, List.of("java", "python", "c++")));
String studentsStr = JSONUtil.toJsonStr(students);
// 將json字符串轉成List<Student>
List<Student> list = JSONUtil.toList(studentsStr, Student.class);

序列化:將對象轉換為字符串。

反序列化:將字符串轉換為對象。

優勢

  • 代碼更簡潔

  • 無需手動處理異常和類型轉換

  • 不需要實現Serializable

擴展:

其他序列化工具:

  • Jackson
    • 組織:com.fasterxml.jackson.core
    • 維護者:FasterXML 公司
    • 是 Spring Boot 默認的 JSON 處理庫
  • Fastjson
    • 組織:com.alibaba
    • 維護者:阿里巴巴
    • 是阿里巴巴開源的 JSON 處理庫

字符串操作

字符串格式化

傳統方式

String name = "lisi";
int age = 23;
double score = 98.5;String s = String.format("姓名:%s,年齡:%d,分數:%.2f", name, age,score);

Hutool方式

StrUtil.format("姓名:{},年齡:{},分數:{}", name, age, score);

優勢

  • 不需要記憶各種格式化符號
  • 統一的占位符語法,更簡潔易懂
  • 減少格式化錯誤的可能性
字符串判空

傳統方式

String str = "  ";
boolean isEmpty = str == null || str.trim().isEmpty();

Hutool方式

boolean isBlank = StrUtil.isBlank("  ");

優勢

  • 自動處理null值
  • 自動去除空白字符判斷
  • 代碼簡潔明了
嚴格空判斷

傳統方式

String str = "";
boolean isEmpty = str == null || str.isEmpty();

Hutool方式

boolean isEmpty = StrUtil.isEmpty("");

優勢

  • 嚴格判斷空字符串(不包括空白字符)
  • 自動處理null值
  • 方法名語義更明確

與isBlank區別

StrUtil.isEmpty("  ");  // false
StrUtil.isBlank("  ");  // true
安全字符串比較

傳統方式

String a = null;
String b = "test";
boolean eq = a != null && a.equals(b);  // a.equals(b)可能NullPointerException 

Hutool方式

boolean eq = StrUtil.equals(null, "test");  // false

優勢

  • 完全避免NullPointerException
  • 可以比較null值
  • 語義更明確

Bean操作

對象屬性拷貝

傳統方式

// 需要手動拷貝每個屬性
Student student = new Student("張三", 18, List.of("java", "python", "c++"));
Student student1 = new Student();
student1.setName(student.getName());
student1.setAge(student.getAge());
student1.setLikes(student.getLikes());
System.out.println(student1);//若需要忽略某些屬性、處理 null 值、轉換日期格式等,需要手動編寫大量邏輯,代碼復用性差。

Hutool方式

// 將源對象的屬性值復制到目標對象中 (目標對象要存在)
BeanUtil.copyProperties(source, target);// 根據源對象創建目標類的實例,并復制屬性值,返回新對象 (目標對象不存在)
User target = BeanUtil.copyProperties(source, Student.class);// 忽略null值 + 忽略指定屬性 + 日期格式轉換   5.7.0 +版有
CopyOptions options = CopyOptions.create().setIgnoreNullValue(true)  // 忽略null值.setIgnoreProperties("id") // 忽略id屬性.setDatePattern("yyyy-MM-dd"); // 日期格式化
BeanUtil.copyProperties(source, target, options);

優勢

  • 代碼簡潔
  • 自動拷貝同名屬性
  • 支持不同類型轉換
  • 復雜格式復用性強
對象與 Map 互轉

傳統實現:

// 原生方式:Bean轉Map
Map<String, Object> map = new HashMap<>();
map.put("name", user.getName());
map.put("age", user.getAge());
// ... 每個屬性都要手動put// 原生方式:Map轉Bean
User user = new User();
user.setName(map.get("name"));
user.setAge(Integer.parseInt(map.get("age")));
// ... 每個屬性都要手動get

Hutool方式

// Bean轉Map
Map<String, Object> map = BeanUtil.beanToMap(user);// Map轉Bean
User user = BeanUtil.mapToBean(map, User.class, true); // true 是否轉換為駝峰命名

優勢:

  • 自動完成屬性與鍵值的映射,
  • 嵌套屬性
  • 類型自動轉換

進階功能與設計思想

設計哲學

  • 鏈式調用:如StrUtil.builder().append().toString()
  • 智能默認值:避免空指針(如Convert.toInt(null, 0)
  • 低侵入性:靜態方法封裝,零配置集成

性能優化技巧

  • 復用工具實例(如SecureUtil.aes(key)生成單例)
  • 大文件處理:流式讀寫避免內存溢出

擴展能力

  • 自定義工具類繼承(如擴展XXXUtil
  • 模塊化引入(按需選擇hutool-core或全量依賴)

實戰案例

環境準備

在開始前,請確保項目中已引入Hutool核心依賴:

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.39</version>
</dependency>

案例1:RandomUtil工具 - 隨機數據生成專家

功能特性
  • 多樣化生成:支持隨機數、字符串、日期、中文名等
  • 安全可靠:基于加密算法的隨機數生成
  • 靈活配置:可自定義長度、范圍、字符集
典型應用場景
  1. 雙色球號碼生成

    通過randomEle()方法實現彩票系統隨機選號:

    // 生成紅球(1-33選6)和藍球(1-16選1)
    String redBalls = RandomUtil.randomEle(getRedBalls()/*獲取紅球的列表*/, 6).stream().map(i -> String.format("%02d", i))/*格式化*/.collect(Collectors.joining(" "));
    String blueBall = String.valueOf(RandomUtil.randomInt(1, 16));
    System.out.println("雙色球號碼:" + redBalls + " + " + blueBall);
    
  2. 企業級數據脫敏

    生成隨機測試數據替代敏感信息:

    // 生成隨機中文姓名
    String chineseName = RandomUtil.randomChineseName();//用RandomUtil.randomChinese()實現單個隨機中文字符
    // 生成隨機公司名稱
    String companyName = RandomUtil.randomStringUpper(5); // 5位含大寫字母
    
  3. 分布式ID生成

    結合時間戳生成唯一ID:

    long timestamp = System.currentTimeMillis();
    String uniqueId = timestamp + "-" + RandomUtil.randomString(6);
    

案例2:TreeUtil工具 - 樹形結構構建大師

功能特性
  • 零遞歸構建:自動處理父子關系
  • 靈活配置:支持自定義節點屬性映射
  • 高效轉換:數據庫數據→樹形結構一鍵轉換
典型應用場景
  1. 部門組織架構展示

    將扁平化數據轉換為樹形層級:

    // 定義節點實體(需繼承TreeNode)
    @Data
    public class DeptNode extends TreeNode<Integer> {private String deptName;private String manager;
    }// 構建樹形結構
    List<DeptNode> deptList = getDataFromDB(); // 從數據庫獲取數據
    List<Tree<Integer>> tree = TreeUtil.build(deptList, 0, config -> {config.setIdKey("id").setParentIdKey("parentId").setNameKey("deptName").putExtra("manager", node -> getManagerName(node.getId()));
    });
    
  2. 菜單權限管理系統

    我們假設要構建一個菜單,可以實現系統管理和店鋪管理,菜單的樣子如下:

    系統管理|- 用戶管理|- 添加用戶店鋪管理|- 商品管理|- 添加商品
    

    那這種結構如何保存在數據庫中呢?一般是這樣的:

    idparentIdnameweight
    10系統管理5
    111用戶管理10
    1111用戶添加11
    20店鋪管理5
    212商品管理10
    2212添加添加11

    動態生成前端菜單樹:

    // 構建node列表
    List<TreeNode<String>> nodeList = CollUtil.newArrayList();nodeList.add(new TreeNode<>("1", "0", "系統管理", 5));
    nodeList.add(new TreeNode<>("11", "1", "用戶管理", 222222));
    nodeList.add(new TreeNode<>("111", "11", "用戶添加", 0));
    nodeList.add(new TreeNode<>("2", "0", "店鋪管理", 1));
    nodeList.add(new TreeNode<>("21", "2", "商品管理", 44));
    nodeList.add(new TreeNode<>("221", "2", "商品管理2", 2));// 0表示最頂層的id是0
    List<Tree<String>> treeList = TreeUtil.build(nodeList, "0");//配置
    TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
    // 自定義屬性名 都要默認值的
    treeNodeConfig.setWeightKey("order");
    treeNodeConfig.setIdKey("rid");
    // 最大遞歸深度
    treeNodeConfig.setDeep(3);//轉換器
    List<Tree<String>> treeNodes = TreeUtil.build(nodeList, "0", treeNodeConfig,(treeNode, tree) -> {tree.setId(treeNode.getId());tree.setParentId(treeNode.getParentId());tree.setWeight(treeNode.getWeight());tree.setName(treeNode.getName());// 擴展屬性 ...tree.putExtra("extraField", 666);tree.putExtra("other", new Object());});
    

    若依的菜單權限管理實現與其類似。

  3. 商品分類樹形展示

    支持多級分類嵌套:

    // 構建帶擴展屬性的分類樹
    List<Category> categories = categoryService.findAll();
    List<Tree<Long>> categoryTree = TreeUtil.build(categories, 0L, config -> {config.setIdKey("id").setParentIdKey("parentId").setNameKey("categoryName").putExtra("imageUrl", node -> getImageUrl(node.getType()));
    });
    

學習資源與延伸

其他的api,大家可翻閱官網代碼示例和Api文檔進行學習。

Hutool中文官網:https://hutool.cn/

api文檔:https://plus.hutool.cn/apidocs/

GitHub倉庫:looly/hutool

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/919044.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/919044.shtml
英文地址,請注明出處:http://en.pswp.cn/news/919044.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《深度解構:構建瀏覽器端Redis控制臺的WebSocket協議核心技術》

Redis作為高性能的內存數據庫,其原生客戶端多依賴命令行或桌面應用,而瀏覽器端控制臺的缺失,成為制約Web化管理的關鍵瓶頸,WebSocket協議的出現,打破了HTTP協議單向通信的局限,為瀏覽器與Redis服務之間建立持久、雙向的實時連接提供了可能。本文將從協議本質、交互邏輯、…

Pushgateway安裝和部署,以及對應Prometheus調整

目錄Pushgateway簡介安裝驗證Prometheus的配置&#xff1a;其它命令Pushgateway簡介 Pushgateway 是 Prometheus 生態系統中的一個組件。主要特點是推送而非拉取&#xff1a;Prometheus 默認采用拉取&#xff08;pull&#xff09;模式收集指標&#xff0c;但 Pushgateway 允許…

JAVA面試匯總(四)JVM(一)

久違的重新寫了一篇面試匯總的&#xff0c;關于JVM的一篇&#xff0c;一共三篇&#xff0c;今天寫了第一篇&#xff0c;繼續重新學習&#xff0c;重新卷起來&#xff0c;come on baby 1.什么情況下會觸發類的初始化&#xff1f; &#xff08;1&#xff09;首先是類未被初始化時…

Agent中的memory

rag系列文章目錄 文章目錄rag系列文章目錄前言一、Memory機制作用二、memory分類三、langgraph實踐總結前言 眾所周知&#xff0c;大模型是無狀態的。但是基于大模型的agent一般是有狀態的&#xff0c;也就是它有記憶功能。在AI Agent框架中&#xff0c;Memory機制是核心組件之…

AI與IT從業者的未來:替代焦慮還是協作革命?

??引言&#xff1a;技術滲透與核心命題??2025年&#xff0c;人工智能技術已從實驗室走向產業核心。國務院《關于深入實施“人工智能”行動的意見》推動AI在醫療、制造、金融等領域的規模化落地&#xff0c;全球AI應用用戶規模突破2.3億&#xff0c;生成式AI工具滲透率達16.…

手機版碰一碰發視頻系統批量剪輯功能開發,支持OEM貼牌

引言在當今短視頻盛行的時代&#xff0c;視頻內容的快速生產與分享變得愈發重要。手機版碰一碰發視頻系統&#xff0c;借助 NFC 等近場通信技術&#xff0c;實現了便捷的數據交互與視頻分享&#xff0c;而在此基礎上集成的批量剪輯功能&#xff0c;更是為內容創作者和商家帶來了…

Spring AMQP如何通過配置文件避免硬編碼實現解耦

在使用Spring AMQP基于注解聲明監聽者時&#xff0c;可通過抽取常量來避免硬編碼&#xff1a;RabbitListener(bindings QueueBinding(exchange Exchange(MQConstant.USER_EXCHANGE),value Queue(MQConstant.USER_QUEUE),key MQConstant.USER_REDIS_BINDING))public void de…

解決zabbix圖片中文亂碼

要把 Zabbix 前端字體替換為 simkai.ttf&#xff08;楷體&#xff0c;解決亂碼常用&#xff09;&#xff0c;按以下步驟操作&#xff1a;1. 確認 simkai.ttf 路徑 先找到系統里 simkai.ttf 字體文件&#xff0c;若沒有&#xff0c;可從 Windows 系統&#xff08;C:\Windows\Fon…

實例分割-動手學計算機視覺13

介紹 實例分割(instance segmentation)的目的是從圖像中分割出每個目標實例的掩模(mask)。與語義分割相比&#xff0c;實例分割不但要區分不同的類別&#xff0c;還要區分出同一種類別下的不同目標實例。如圖13-1所示 語義分割的結果中&#xff0c;不同的羊對應的標簽是一樣的…

水環境遙感分析!R語言編程+多源遙感數據預處理;水體指數計算、水深回歸分析、水溫SVM預測、水質神經網絡建模及科研級可視化制圖

系統性地整合R語言編程、遙感數據處理及機器學習建模&#xff0c;涵蓋水線提取&#xff08;水體指數與閾值法&#xff09;、水深反演&#xff08;多元回歸&#xff09;、水溫預測&#xff08;支持向量機&#xff09;、水質評估&#xff08;神經網絡&#xff09;等核心內容&…

微信公眾號/小程序百萬級OpenID自動化獲取工具

摘要 本報告詳細闡述了微信用戶列表數據獲取與處理工具的設計思路,包括分頁處理機制、頻率控制策略、斷點續傳功能和分布式存儲方案。針對微信API調用限制和用戶數據規模特點,該工具旨在高效、安全地獲取和存儲微信用戶列表數據,同時嚴格遵守微信API調用頻率限制,確保系統…

物聯網系統中傳感器到網關到物聯網平臺的傳輸路徑、協議、原理、用途與架構詳解

摘要物聯網&#xff08;IoT&#xff09;系統通過傳感器、網關和物聯網平臺實現數據的采集、傳輸、處理和應用。本文詳細分析了傳感器到網關再到物聯網平臺的傳輸路徑&#xff0c;涵蓋直接連接、網關中繼、邊緣計算、多級網關和混合路徑五種方式&#xff1b;介紹了短距離&#x…

SpringBoot自動注入配置類初步實現

一.SpringBoot自動裝配SpringBoot 的 自動裝配&#xff08;Auto-Configuration&#xff09; 是它的核心特性之一&#xff0c;它讓開發者可以 "開箱即用"&#xff0c;避免手動配置大量的 XML 或 Java Config。它的核心思想是&#xff1a;"約定優于配置"&…

直播預告|鴻蒙生態中的AI新玩法

想知道鴻蒙生態里 AI 能玩出啥新花樣&#xff1f; 8 月 14 日&#xff08;周四&#xff09;20:00 &#xff0c;「開發者?面對面 堅果派特輯 —— 鴻蒙生態中的 AI 新玩法」直播來襲&#xff01; &#x1f50d; 直播亮點搶先看 AI賦能鴻蒙產品開發&#xff1a;將分享如何利用AI…

智能合約:區塊鏈時代的“數字契約革命”

一、技術原理與核心特征1. 定義與本質智能合約是運行在區塊鏈上的自動化程序&#xff0c;通過代碼定義業務規則&#xff0c;在預設條件滿足時自動執行操作&#xff08;如資金轉移、信息更新&#xff09;&#xff0c;無需人工干預。其核心特性包括&#xff1a;自動執行&#xff…

【數據分析】比較SparCC、Pearson和Spearman相關性估計方法在合成組學數據上的表現

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹 加載R包 模擬數據 構建網絡 RMSE指數計算 畫圖 總結 系統信息 介紹 在生物信息學和生態學研究中,組學數據的分析越來越依賴于對微生物群落或基因表達數據中物種或基因間相關性的…

Google C++ 風格指南

文章目錄背景介紹風格指南的目標C 版本頭文件自包含頭文件#define 防護包含所需內容前置聲明在頭文件中定義函數頭文件包含順序與命名規范作用域命名空間內部鏈接非成員函數、靜態成員函數與全局函數局部變量靜態與全局變量關于析構的決策關于初始化的決策常見模式thread_local…

安裝部署_WVP流媒體

文章目錄一、DEV_WVP流媒體開發手冊1、搭建流媒體服務clone代碼&#xff1a;安裝編譯器cmake構建和編譯項目修改配置文件啟動項目2、搭建GB28181協議視頻平臺安裝 jdk, nodejs, maven, git安裝redis安裝postgresqlclone代碼編譯前端代碼編譯后端代碼配置文件修改3、設備接入測測…

軟件I2C實現(2):I2C協議實現

0 參考資料 I2C 總線規范.pdf 1 I2C協議實現 1.1 SCL、SDA引腳初始化 將SCL、SDA初始化為開漏輸出,電平設置為高電平(使用外部上拉電阻拉高)。 /*** @brief 軟件I2C初始化** @param sw_i2c_cfg 軟件I2C配置指針*/ int sw_i2c_init(sw_i2c_cfg_t *sw_i2c_cfg) {GPIO_InitT…

瘋狂星期四文案網第40天運營日記

網站運營第40天&#xff0c;點擊觀站&#xff1a; 瘋狂星期四 crazy-thursday.com 全網最全的瘋狂星期四文案網站 運營報告 今日訪問量 今日搜索引擎收錄情況 必應秒發秒收 百度收錄很慢 網站優化點 優化seo 修復已知bug