Stream排序不止sorted:thenComparing让你掌控多字段优先级

SIPVicious实战指南:从零开始掌握VoIP渗透测试(Kali Linux环境) 本文为SIPVicious实战指南,详细介绍了在Kali Linux环境下进行VoIP渗透测试的完整流程。从环境准备与工具安装开始,逐步讲解如何使用svmap扫描SIP服务器、svwar枚举PBX分机号,以及svcrack进行密码安全测试,并整合svreport生成报告。旨在帮助安全从业者从零开始,系统掌握这套经典开源工具,在授权范围内有效评估VoIP系统的安全性。 阅读详情

第一章:Stream排序不止sorted:thenComparing让你掌控多字段优先级

在Java 8的Stream API中,sorted()方法是实现集合排序的常用工具。然而,当面对需要按多个字段进行优先级排序的场景时,仅靠sorted()无法满足需求。此时,Comparator.thenComparing()方法便成为关键利器,它允许开发者构建复合比较器,实现多层级排序逻辑。

复合排序的实际应用场景

例如,在处理员工数据时,可能需要先按部门升序排列,再按工资降序排列,最后按姓名字母顺序排序。通过链式调用thenComparing(),可以清晰表达这种优先级关系。
// 定义员工类
class Employee {
    String name;
    String department;
    int salary;

    // 构造函数、getter等省略
}

// 多字段排序示例
List<Employee> employees = ...;
List<Employee> sorted = employees.stream()
    .sorted(Comparator
        .comparing(Employee::getDepartment)                    // 第一优先级:部门升序
        .thenComparing(Employee::getSalary, Comparator.reverseOrder()) // 第二优先级:工资降序
        .thenComparing(Employee::getName)                     // 第三优先级:姓名升序
    )
    .toList();
上述代码中,comparing()创建初始比较器,每个thenComparing()添加下一级排序规则。支持指定自然顺序、自定义比较器或逆序排列。

thenComparing方法的多种重载形式

  • thenComparing(Comparator<T>):传入另一个比较器
  • thenComparing(Function<T, U>, Comparator<U>):指定提取字段及比较方式
  • thenComparing(Function<T, U>):字段需实现Comparable接口
方法签名用途说明
thenComparing(comparator)追加一个完整的比较器逻辑
thenComparing(keyExtractor, keyComparator)对提取的键值使用特定比较器排序
thenComparing(keyExtractor)键值类型需实现Comparable

第二章:理解Comparator与thenComparing核心机制

2.1 Comparator接口基础与自然排序和自定义排序

Java中的`Comparator`接口位于`java.util`包中,用于定义对象之间的比较规则,支持自然排序和自定义排序。自然排序通过实现`Comparable`接口完成,而`Comparator`则提供更灵活的外部比较机制。
自定义排序示例
List<String> names = Arrays.asList("Bob", "Alice", "Charlie");
names.sort((a, b) -> a.length() - b.length());
上述代码使用Lambda表达式按字符串长度升序排列。`Comparator`的`compare(T a, T b)`方法返回负数、零或正数,表示a小于、等于或大于b。
常见实现方式对比
方式适用场景灵活性
Comparable单一排序逻辑低
Comparator多维度排序高

2.2 thenComparing方法的工作原理与链式调用机制

在Java中,`thenComparing`是`Comparator`接口提供的核心方法之一,用于构建复合比较器。当主排序规则无法区分两个对象时,它会触发次级比较逻辑,实现多字段优先级排序。
链式调用的执行流程
通过`thenComparing`可串联多个比较器,形成优先级队列。首先应用主比较器,若返回0(相等),则继续使用下一个比较器进行判定。

Comparator byName = Comparator.comparing(Person::getName);
Comparator byAge = Comparator.comparingInt(Person::getAge);
Comparator composite = byName.thenComparing(byAge);

// 排序时先按姓名,姓名相同则按年龄
Arrays.sort(people, composite);
上述代码中,`thenComparing`接收一个新比较器并返回增强后的复合比较器。其内部通过闭包保存前序比较逻辑,形成调用链。
方法重载与类型适配
`thenComparing`提供多种重载形式,支持函数提取、逆序及显式比较器传入,灵活应对不同数据类型与排序需求。

2.3 多字段排序中的优先级传递与比较器组合

在复杂数据结构的排序场景中,多字段排序通过优先级传递机制实现精细化控制。字段间的排序权重依次递减,前一字段相等时,交由下一字段的比较器处理。
比较器组合策略
采用链式比较器可实现多个排序规则的无缝衔接。以下为 Go 语言示例:
type User struct {
    Name string
    Age  int
    Score float64
}

// 多字段排序比较器组合
sort.Slice(users, func(i, j int) bool {
    if users[i].Name != users[j].Name {
        return users[i].Name < users[j].Name // 主排序:姓名升序
    }
    if users[i].Age != users[j].Age {
        return users[i].Age < users[j].Age   // 次排序:年龄升序
    }
    return users[i].Score > users[j].Score   // 三排序:分数降序
})
上述代码中,优先按姓名排序;姓名相同时按年龄升序;若前两者均相同,则按分数降序排列。这种层叠判断逻辑体现了优先级传递的本质。
排序规则优先级表
字段排序方向优先级
Name升序1
Age升序2
Score降序3

2.4 逆序排序与null值处理在thenComparing中的应用

在Java流式编程中,当使用 Comparator.thenComparing() 构建复合排序逻辑时,常需处理逆序排列和null值场景。
逆序排序实现
通过 Comparator.reverseOrder() 或 reversed() 方法可反转比较逻辑:

List<Person> sorted = people.stream()
    .sorted(Comparator.comparing(Person::getAge)
        .thenComparing(Person::getName, Comparator.reverseOrder()))
    .collect(Collectors.toList());
上述代码先按年龄升序,再按姓名降序排列。第二个比较器显式指定逆序规则,确保姓名相同时排序方向可控。
null值安全处理
为避免null引发异常,应使用 Comparator.nullsFirst() 或 nullsLast() 包装器:

.sorted(Comparator.comparing(Person::getDepartment, Comparator.nullsFirst(String::compareTo))
    .thenComparing(Person::getSalary, Comparator.nullsLast(Double::compareTo)))
该策略优先将null部门置于前端,薪资null值排至末尾,保障排序稳定性与数据完整性。

2.5 性能分析:比较器链的开销与优化建议

在复杂排序逻辑中,比较器链通过组合多个比较器实现多级排序。然而,每增加一个比较器,都会引入额外的方法调用开销和对象引用跳转,影响整体性能。
常见性能瓶颈
  • 频繁的对象方法调用导致栈帧开销增大
  • 冗余的空值检查和字段提取操作
  • 链式调用中断短路逻辑,降低 CPU 分支预测准确率
优化代码示例

Comparator optimized = Comparator
    .comparing(Person::getAge, Comparator.nullsFirst(Integer::compareTo))
    .thenComparing(Person::getName, Comparator.nullsLast(String::compareTo))
    .thenComparingInt(Person::getId);
上述代码通过复用比较器实例、使用原生比较方法(如 thenComparingInt)减少装箱开销,并集中处理 null 值策略,显著降低执行延迟。
性能对比表
策略平均耗时 (ns)GC 次数
普通链式比较85012
优化后比较器链5206

第三章:实战中的多字段排序场景设计

3.1 用户信息按姓名升序、年龄降序排列

在处理用户数据时,常需根据多字段进行复合排序。本节实现按姓名升序、年龄降序的排序逻辑。
排序规则解析
首先按姓名字母顺序升序排列,若姓名相同,则按年龄从高到低降序排列,确保数据呈现更符合业务需求。
代码实现
type User struct {
    Name string
    Age  int
}

sort.Slice(users, func(i, j int) bool {
    if users[i].Name == users[j].Name {
        return users[i].Age > users[j].Age // 年龄降序
    }
    return users[i].Name < users[j].Name // 姓名升序
})
上述代码中,sort.Slice 接收切片和比较函数。当姓名相同时,返回年龄较大的优先;否则按姓名字典序排列。
测试数据验证
姓名年龄
Alice30
Alice25
Bob35
排序后,"Alice" 组内年龄从30→25,符合预期。

3.2 商品列表按类别分组后价格与销量综合排序

在电商系统中,对商品按类别分组后进行价格与销量的综合排序,能显著提升用户浏览体验。首先需将商品数据按分类字段聚合。
数据结构设计
使用结构体表示商品信息,关键字段包括类别、价格和月销量:
type Product struct {
    Category string  `json:"category"`
    Price    float64 `json:"price"`
    Sales    int     `json:"sales"`
}
该结构便于后续分组与权重计算。
排序策略实现
采用加权评分公式:Score = 0.6×标准化销量 + 0.4×(1−标准化价格),确保高销量且低价商品优先。 排序流程如下:
  1. 按 Category 分组商品
  2. 在每组内对 Price 和 Sales 做 min-max 归一化
  3. 计算综合得分并降序排列
最终结果在保持类目隔离的同时,实现了组内最优展示顺序。

3.3 日志记录按时间倒序、级别优先、线程名次序排列

在分布式系统调试中,日志的可读性直接影响问题定位效率。合理的排序策略能显著提升排查速度。
多维度日志排序逻辑
日志应首先按时间戳倒序排列,确保最新事件位于前端;其次在相同时间精度下,按日志级别(ERROR > WARN > INFO > DEBUG)优先排序;最后按线程名称字母顺序稳定排序,避免并发输出导致的抖动。
排序规则实现示例
type LogEntry struct {
    Timestamp int64
    Level     string
    Thread    string
    Message   string
}

// 排序函数
func (a LogEntry) Less(b LogEntry) bool {
    if a.Timestamp != b.Timestamp {
        return a.Timestamp > b.Timestamp // 时间倒序
    }
    levelOrder := map[string]int{"ERROR": 0, "WARN": 1, "INFO": 2, "DEBUG": 3}
    if levelOrder[a.Level] != levelOrder[b.Level] {
        return levelOrder[a.Level] < levelOrder[b.Level] // 级别优先
    }
    return a.Thread < b.Thread // 线程名字典序
}
上述代码通过复合比较实现三级排序:时间倒序保证实时性,级别优先突出严重问题,线程名次序增强可追踪性。

第四章:复杂对象排序的进阶技巧

4.1 嵌套对象属性的提取与比较器构建

在处理复杂数据结构时,常需从嵌套对象中提取特定属性并构建可复用的比较逻辑。通过泛型与反射机制,可实现通用的属性访问器。
属性路径解析
支持以点号分隔的路径(如 user.profile.age)动态获取值:

func GetNestedField(obj map[string]interface{}, path string) (interface{}, bool) {
    parts := strings.Split(path, ".")
    var current interface{} = obj
    for _, part := range parts {
        if m, ok := current.(map[string]interface{}); ok {
            if val, exists := m[part]; exists {
                current = val
            } else {
                return nil, false
            }
        } else {
            return nil, false
        }
    }
    return current, true
}
该函数逐层遍历映射结构,确保路径存在且类型匹配。
比较器构造
基于提取结果,可构建排序用比较函数:
  • 升序比较器:返回 a < b
  • 降序比较器:返回 a > b
  • 空值优先策略:控制 null 值排序位置

4.2 使用方法引用简化thenComparing代码表达

在Java流式编程中,thenComparing常用于组合多个排序条件。传统方式通过Lambda表达式实现,但代码冗长。使用方法引用可显著提升可读性。
方法引用替代Lambda
例如,对用户按姓名排序后按年龄排序:
Comparator byNameThenAge = 
    Comparator.comparing(User::getName)
              .thenComparing(User::getAge);
此处User::getAge为方法引用,等价于u -> u.getAge(),更简洁且语义清晰。
链式排序的优化效果
  • 减少样板代码,增强函数式风格
  • 避免重复书写参数变量名
  • 便于静态方法或实例方法的直接复用
结合自然排序或自定义比较器,方法引用使多级排序逻辑一目了然。

4.3 自定义比较逻辑实现模糊匹配或权重排序

在复杂数据检索场景中,精确匹配难以满足业务需求,需引入自定义比较逻辑实现模糊匹配与权重排序。
模糊匹配策略
通过编辑距离(Levenshtein Distance)衡量字符串相似度,适用于拼写纠错或近似查询:
// 计算两字符串间编辑距离
func Levenshtein(a, b string) int {
    // 动态规划实现字符替换、插入、删除的最小操作数
    // 距离越小,相似度越高
    ...
}
该算法时间复杂度为 O(m×n),适合短文本匹配。
加权排序模型
结合多维度评分(如相关性、热度、时效性)进行加权计算:
字段权重归一化值
关键词匹配度0.50.9
点击率0.30.7
发布时间0.20.8
最终得分 = Σ(权重 × 归一化值),实现综合排序。

4.4 结合Stream其他操作实现分页与去重后的排序

在Java Stream中,可通过链式操作高效实现数据的去重、分页与排序。合理组合distinct()、sorted()与skip-limit模式,可构建流畅的数据处理流程。
核心操作链解析
  • distinct():基于对象hashCode与equals去除重复元素
  • sorted(Comparator):指定排序规则,支持升序或降序
  • skip(pageSize * pageNumber):跳过前N条记录实现分页偏移
  • limit(pageSize):限制返回结果数量
代码示例
List<User> result = users.stream()
    .distinct()
    .sorted(Comparator.comparing(User::getName))
    .skip(20)         // 第二页,每页10条
    .limit(10)
    .collect(Collectors.toList());
上述代码首先去重,再按姓名排序,最后提取第二页数据(偏移20,取10条),适用于前端分页场景。

第五章:总结与最佳实践建议

性能监控与调优策略
在高并发系统中,持续的性能监控至关重要。推荐使用 Prometheus + Grafana 构建可视化监控体系,实时追踪服务延迟、QPS 和资源利用率。
  • 定期分析 GC 日志,识别内存泄漏风险
  • 使用 pprof 工具定位 Go 服务中的 CPU 与内存热点
  • 设置告警阈值,如 P99 延迟超过 500ms 触发通知
配置管理最佳实践
避免将敏感配置硬编码在代码中。以下是一个使用 Viper 加载配置的示例:

// config.go
type Config struct {
    ServerPort int   `mapstructure:"server_port"`
    DBHost     string `mapstructure:"db_host"`
}

func LoadConfig(path string) (*Config, error) {
    var config Config
    viper.SetConfigFile(path)
    viper.ReadInConfig()
    viper.Unmarshal(&config)
    return &config, nil
}
微服务间通信安全
在 Kubernetes 环境中,建议启用 mTLS 来保障服务间通信。通过 Istio 的 PeerAuthentication 策略强制加密流量,并结合 RBAC 控制访问权限。
实践项推荐方案适用场景
日志收集Fluentd + Elasticsearch跨集群统一日志平台
配置中心Consul + Watcher动态配置热更新
自动化部署流水线
采用 GitLab CI/CD 实现从代码提交到生产发布的全自动化流程。关键阶段包括单元测试、镜像构建、安全扫描和蓝绿部署验证。
【QNX+Android虚拟化方案】125 - 如何创建android-spare镜像 阅读详情

相关推荐

用OpenCV+ROS实现焊接机器人智能纠偏:线激光视觉的算法调参全流程

本文详细介绍了基于OpenCV和ROS的焊接机器人智能纠偏系统全流程。通过线激光视觉系统实时感知焊缝,重点解析了抗干扰图像预处理、改进的Steger算法提取激光条纹中心线,以及从2D像素到机器人基坐标系的完整坐标变换。该系统为应对焊接飞溅、弧光等复杂工况,实现高精度实时路径纠偏提供了从算法优化到工程集成的完整解决方案。

vodka的博客 159

【Java 8 新特性】Java Comparator.thenComparing | 添加次级排序方式

Java Comparator.thenComparing | 添加次级排序方式Comparator.thenComparingComparator.thenComparingIntComparator.thenComparingLongComparator.thenComparingDouble参考文献 thenComparing是比较器功能接口的默认方法。 Comparator.thenComparing方法是在Java 8中引入的。 Comparator.thenComparing返回一个词表顺序的比

猫巳的博客 2万+

基于NE555的触摸延时开关电路设计与实现

本文详细介绍了基于NE555芯片的触摸延时开关电路设计与实现方法。通过分析NE555的单稳态工作模式,结合定时电阻、电解电容等关键元件选型,提供了一套完整的电路搭建方案。文章还包含抗干扰设计、调试技巧及常见故障处理,帮助电子爱好者快速掌握触摸延时灯的制作要点。

weixin_29268267的博客 788

Java多条件排序使用Comparator和thenComparing【包含排序List<Map<String, String>>】

Comparator接口是Java用于自定义对象排序的关键接口。它包含了一个compare方法,允许我们定义如何比较两个对象。通常,我们会使用Comparator来排序列表或集合中的自定义对象。

『愚』的博客 7176

自然语言处理6 -- 情感分析

1 概述 情感分析是自然语言处理中常见的场景,比如淘宝商品评价,饿了么外卖评价等,对于指导产品更新迭代具有关键性作用。通过情感分析,可以挖掘产品在各个维度的优劣,从而明确如何改进产品。比如对外卖评价,可以分析菜品口味、送达时间、送餐态度、菜品丰富度等多个维度的用户情感指数,从而从各个维度上改进外卖服务。 情感分析可以采用基于情感词典的传统方法,也可以采用基于深度学习的方法,下面详细讲解 ...

谢杨易的博客 5万+

LeRobot 宇树人形机器人 G1 部署 GR00T 运动策略

本文详细介绍了Unitree G1人形机器人的完整设置流程。首先通过以太网连接机器人并进行SSH访问,然后配置WiFi网络实现无线连接。在机器人端安装LeRobot软件并运行服务器程序,最后在控制端配置IP地址并运行GR00T移动控制系统。指南涵盖了29自由度和23自由度版本G1机器人的配置方法,支持通过WiFi进行远程策略部署,提供双足行走与平衡控制功能,并详细说明了遥控器操作方式。

2506_90492529的博客 2172

Java8之thenComparing

Comparator.thenComparing

四问四不知的博客 1641

【YOLO部署Android安卓手机APP】YOLO11部署到安卓实时目标检测识别——以火焰烟雾目标检测识别举例(可自定义更换其他目标)

本项目基于YOLOv11部署到手机APP实现对火焰烟雾的检测识别,当然,以此你可以按照本项目开发步骤扩展更换为其他目标进行检测,例如更换为车牌、手势、人脸面部活动、人脸表情、火焰烟雾、行人、口罩、行为、水果、植物、农作物等等部署手机APP进行检测。本文为详细设计/配置文档,包含完整所需的环境配置搭建,项目工程配置步骤等,手把手记录使用pycharm和Android studio的工程开发过程,实现YOLO部署到安卓。实战开发,亲测无误。演示视频训练了50轮进行了展示(为演示,训练轮数较少,你可以训练轮数多些

嵌入式阿齐Archie 1万+

JAVA8 Stream之Sort排序comparing和thenComparing

本文转自http://ddrv.cn/a/100811

Dannie的博客 3186

基础入门篇 | YOLOv8 项目【训练】【验证】【推理】最简单教程 | YOLOv8必看 | 最新更新,直接打印 FPS,mAP50,75,95

三个文件搞定YOLOv8【训练】【验证】【推理】🚀🚀🚀

Coding... 2万+

回归预测 | MATLAB实现MPR多元多项式回归

回归预测 | MATLAB实现MPR多元多项式回归

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 1645

【Java 基础】25 比较器

Java 提供了丰富的排序工具和灵活的排序方式(如:Comparable、Comparator及组合比较器),使得对数组进行排序变得简便而高效。这些工具可以根据元素类型的自然顺序或自定义的排序来实现。

好久不见的流星 1832

如何修改网页中的文本内容改成自己希望的数值?

本篇文章主要讲解,通过浏览器命令和浏览器自带的F12开发者工具,进行修改网页内容的方法教程 日期:2021年12月5日 作者:任聪聪 一、通过F12开发者工具进行修改 进入方式汇总: 1.右击鼠标,显示菜单找到审查 2.通过快捷键F12进入,笔记本需要先关闭fnlk功能键。 开发者工具介绍 说明: 1.表示选择元素,点击后可以选择文本的元素所在地 2.表示显示方式,手机还是电脑 3.表示div元素,点击后可以展开,对div内的html和文本进行编辑。 双击文本,即可进行修改成自己想要的,但是刷新后.

任聪聪的博客 2万+

jdk8 sorted 排序值comparing 和thenComparing 偶遇问题解析

在java8之前,排序有两种方法:1.定义比较器类 继承Comparator接口,然后重写compare(a,b) 方法,返回的结果是int类型 0  代表 a==b1 代表 a&gt;b-1 代表 a&lt;b2.定义比较器对象Comparator&lt;Person&gt; c1 = new Comparator&lt;Person&gt;() { @Override ...

u011381576的博客 3万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java8 stream多字段排序

List<类> list; 代表某集合 //返回 对象集合以类属性一升序排序 list.stream().sorted(Comparator.comparing(类::属性一)); //返回 对象集合以类属性一降序排序 注意两种写法 list.stream().sorted(Comparator.comparing(类::属性一).reversed());//先以属性一升序,结果进行...

weixin_42551921的博客 2150

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【java】集合排序,集合内排序,集合与集合排序,stream().sorted(Comparator.comparing(p -> p.age)),list.sort((a, b) -> {};

【java】集合排序,集合内排序,集合与集合排序,stream().sorted(Comparator.comparing(p -> p.age)),list.sort((a, b) -> {};

想去码头整点儿薯条儿~ 2754

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java Stream Sored与thenComparing排序

Java 8 的stream的sorted以及使用thenComparing排序的一些经验总结

qq_60311615的博客 891

揭秘Java Stream多级排序:thenComparing的5种高阶用法

掌握Java 8 Stream API排序技巧,轻松实现多级排序。详解thenComparing在对象排序、复合条件、空值处理等5种高阶用法,提升代码可读性与性能。适用于集合排序、自定义比较器等场景,Java开发进阶必备,值得收藏。

FuncTide的博客 757

Java8 lambda表达式,Comparator.comparing().thenComparing()报错

最近更新 加上了部分我自己对问题的理解,同时附件信息中贴上了一个我最近在公司内部分享的PPT,里面详细讲述了函数式接口、Lambda表达式、Stream、Optional等JDK8的新特性。有需求的同学可以下载参考一下。 引子 在对集合进行操作的时候,我喜欢用Java8的新特性——Stream/lambda表达式等。最近,在项目中就碰到了一个怪异的问题,这里记录下来,并将解决方式分享给大家。...

蛋壳城堡 2万+

如何用thenComparing写出优雅又高效的排序代码?

掌握Java 8 Stream API 排序 thenComparing,轻松实现多字段优雅排序。适用于集合数据的复合条件排序场景,通过thenComparing链式调用提升代码可读性与性能。简洁流畅,逻辑清晰,值得收藏。

SimTrans的博客 1018

Comparator.comparing,thenComparing多属性排序,及空指针处理

Comparator.comparing,thenComparing多属性排序,及空指针处理。

fenyu8的专栏 2655

一篇告诉你Comparator.comparing的使用

一篇学会JAVASE的Comparator函数式接口以及comparing方法;

qq_45979629的博客 2万+

java8使用 Comparator.comparing 进行排序

java8使用 Comparator.comparing 进行排序

q1353122328的博客 5414

【java8分页排序】lambda的(多字段)分页和排序 comparing,thenComparing的区别

java8的lambda表达式排序,理应用comparing,多字段 后面增加thenComparing,默认排序规则为正序。 排序 现在有个排序需求: a-倒序 b-当a相同时,正序 c-当b相同时,倒序 正确的写法: List<UserCouponVo> newList = list.stream().sorted(Comparator .comparing(UserCouponVo::getA,Comparator.reverseOrder())

shenhaiyushitiaoyu的博客 2720

关于sorted的Comparator.comparing排序字符串乱序问题解决

日期一直都是错的,调查后发现日期是String类型,而且是2024-05这种格式,没法转换数字,今天在对列表集合进行排序的时候,Comparator.comparing有个列表怎么都不对,需求:先使用日期排序,再使用销量排序。经调查,String字符串是按照。

qq_35129986的博客 1055
上一篇: 模型训练成果保不住?,深度解析PyTorch参数保存的坑与避坑方案
下一篇: Spring Boot缓存设计精华(@Cacheable注解背后的秘密机制大公开)
simcode
博客等级 码龄14年 154粉丝 2026原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值