编码规范 | Java函数优雅之道(上)

640?wx_fmt=gif

点击上方蓝字,关注高德技术!

1.

导读


随着软件项目代码的日积月累,系统维护成本变得越来越高,是所有软件团队面临的共同问题。持续地优化代码,提高代码的质量,是提升系统生命力的有效手段之一。软件系统思维有句话“Less coding, more thinking(少编码、多思考)”,也有这么一句俚语“Think more, code less(思考越多,编码越少)”。所以,我们在编码中多思考多总结,努力提升自己的编码水平,才能编写出更优雅、更高质、更高效的代码。

本文总结了一套与Java函数相关的编码规则,旨在给广大Java程序员一些编码建议,有助于大家编写出更优雅、更高质、更高效的代码。这套编码规则,通过在高德采集部门的实践,已经取得了不错的成效。

2.

使用通用工具函数


2.1 案例一

现象描述:

不完善的写法:

thisName != null && thisName.equals(name);

更完善的写法:

(thisName == name) || (thisName != null && thisName.equals(name));

建议方案:

Objects.equals(name, thisName);

2.2 案例二

现象描述:

!(list == null || list.isEmpty());

建议方案:

import org.apache.commons.collections4.CollectionUtils;
CollectionUtils.isNotEmpty(list);

2.3 主要收益

  • 函数式编程,业务代码减少,逻辑一目了然;

  • 通用工具函数,逻辑考虑周全,出问题概率低。

3.

拆分超大函数


当一个函数超过80行后,就属于超大函数,需要进行拆分。

3.1 案例一:每一个代码块都可以封装为一个函

每一个代码块必然有一个注释,用于解释这个代码块的功能。

如果代码块前方有一行注释,就是在提醒你——可以将这段代码替换成一个函数,而且可以在注释的基础上给这个函数命名。如果函数有一个描述恰当的名字,就不需要去看内部代码究竟是如何实现的。

现象描述:

建议方案:

// 每日生活函数
public void liveDaily() {
    // 吃饭
    eat();

    // 编码
    code();

    // 睡觉
    sleep();
}

// 吃饭函数
private void eat() {
    // 吃饭相关代码
}

// 编码函数
private void code() {
    // 编码相关代码
}

// 睡觉函数
private void sleep() {
    // 睡觉相关代码
}

3.2 案例二:每一个循环体都可以封装为一个函

现象描述:

建议方案:

// 生活函数
public void live() {
    while (isAlive) {
        // 每日生活
        liveDaily();
    }
}

// 每日生活函数
private void liveDaily() {
    // 吃饭
    eat();

    // 编码
    code();

    // 睡觉
    sleep();
}

3.3 案例三:每一个条件体都可以封装为一个函

现象描述:

建议方案:

// 外出函数
public void goOut() {
    // 判断是否周末
    // 判断是否周末: 是周末则游玩
    if (isWeekday()) {
        play();
    }
    // 判断是否周末: 非周末则工作
    else {
        work();
    }
}

// 游玩函数
private void play() {
    // 游玩代码几十行
}

// 工作函数
private void work() {
    // 工作代码几十行
}

3.4 主要收益

  • 函数越短小精悍,功能就越单一,往往生命周期较长;

  • 一个函数越长,就越不容易理解和维护,维护人员不敢轻易修改;

  • 在过长函数中,往往含有难以发现的重复代码。

4.

同一函数内代码块级别尽量一致


4.1 案例一

现象描述:

很明显,睡觉这块代码块,跟eat(吃饭)和code(编码)不在同一级别上,显得比较突兀。如果把写代码比作写文章,eat(吃饭)和code(编码)是段落大意,而睡觉这块代码块属于一个详细段落。而在liveDaily(每日生活)这个函数上,只需要写出主要流程(段落大意)即可。

建议方案:

public void liveDaily() {
    // 吃饭
    eat();

    // 编码
    code();

    // 睡觉
    sleep();
}

// 睡觉
private void sleep() {
    // 睡觉相关代码
}

4.2 主要收益

  • 函数调用表明用途,函数实现表达逻辑,层次分明便于理解;

  • 不用层次的代码块放在一个函数中,容易让人觉得代码头重脚轻。

5.

封装相同功能代码为函数


5.1 案例一:封装相同代码为函数

现象描述:

建议方案:

// 禁用用户函数
public void disableUser() {
    // 禁用黑名单用户
    List<Long> userIdList = queryBlackUser();
    for (Long userId : userIdList) {
        disableUser(userId);
    }

    // 禁用过期用户
    userIdList = queryExpiredUser();
    for (Long userId : userIdList) {
        disableUser(userId);
    }
}

// 禁用用户函数
private void disableUser(Long userId) {
    User userUpdate = new User();
    userUpdate.setId(userId);
    userUpdate.setEnable(Boolean.FALSE);
    userDAO.update(userUpdate);
}

5.2 案例二:封装相似代码为函数

封装相似代码为函数,差异性通过函数参数控制。

现象描述:

建议方案:

// 通过工单函数
public void adoptOrder(Long orderId) {
    auditOrder(orderId, OrderStatus.ADOPTED);
}

// 驳回工单函数
public void rejectOrder(Long orderId) {
    auditOrder(orderId, OrderStatus.REJECTED);
}

// 审核工单函数
private void auditOrder(Long orderId, OrderStatus orderStatus) {
    Order orderUpdate = new Order();
    orderUpdate.setId(orderId);
    orderUpdate.setStatus(orderStatus);
    orderUpdate.setAuditTime(new Date());
    orderDAO.update(orderUpdate);
}

5.3 主要收益

  • 封装公共函数,减少代码行数,提高代码质量;

  • 封装公共函数,使业务代码更精炼,可读性可维护性更强。

6.

封装获取参数值函数


6.1 案例一

现象描述:

建议方案:

// 是否通过函数
public boolean isPassed(Long userId) {
    // 获取通过阈值
    double thisPassThreshold = getPassThreshold();

    // 获取通过率
    double passRate = getPassRate(userId);

    // 判读是否通过
    return passRate >= thisPassThreshold;
}

// 获取通过阈值函数
private double getPassThreshold() {
    if (Objects.nonNull(passThreshold)) {
        return passThreshold;
    }
    return PASS_THRESHOLD;
}

6.2 主要收益

  • 把获取参数值从业务函数中独立,使业务逻辑更清晰;

  • 封装的获取参数值为独立函数,可以在代码中重复使用。

7.

通过接口参数化封装相同逻辑


7.1 案例一

现象描述:

建议方案:

// 发送审核员结算数据函数
public void sendAuditorSettleData() {
    sendWorkerSettleData(WorkerPushDataType.AUDITOR, () -> auditTaskDAO.statAuditorSettleData());
}

// 发送验收员结算数据函数
public void sendCheckerSettleData() {
    sendWorkerSettleData(WorkerPushDataType.CHECKER, () -> auditTaskDAO.statCheckerSettleData());
}

// 发送作业员结算数据函数
public void sendWorkerSettleData(WorkerPushDataType dataType, WorkerSettleDataProvider dataProvider) {
    List<WorkerSettleData> settleDataList = dataProvider.statWorkerSettleData();
    for (WorkerSettleData settleData : settleDataList) {
        WorkerPushData pushData = new WorkerPushData();
        pushData.setId(settleData.getWorkerId());
        pushData.setType(dataType);
        pushData.setData(settleData);
        pushService.push(pushData);
    }
}

// 作业员结算数据提供者接口
private interface WorkerSettleDataProvider {
    // 统计作业员结算数据
    public List<WorkerSettleData> statWorkerSettleData();
}

7.2 主要收益

  • 把核心逻辑从各个业务函数中抽析,使业务代码更清晰更易维护;

  • 避免重复性代码多次编写,精简重复函数越多收益越大。

8.

减少函数代码层级


如果要使函数优美,建议函数代码层级在1-4之间,过多的缩进会让函数难以阅读。

8.1 案例一:利用return提前返回函数

现象描述:

建议方案:

// 获取用户余额函数
public Double getUserBalance(Long userId) {
    // 获取用户信息
    User user = getUser(userId);
    if (Objects.isNull(user)) {
        return null;
    }

    // 获取用户账户
    UserAccount account = user.getAccount();
    if (Objects.isNull(account)) {
        return null;
    }

    // 返回账户余额
    return account.getBalance();
}

8.2 案例二:利用continue提前结束循环

现象描述:

建议方案:

// 获取合计余额函数
public double getTotalBalance(List<User> userList) {
    // 初始合计余额
    double totalBalance = 0.0D;

    // 依次累加余额
    for (User user : userList) {
        // 获取用户账户
        UserAccount account = user.getAccount();
        if (Objects.isNull(account)) {
            continue;
        }

        // 累加用户余额
        Double balance = account.getBalance();
        if (Objects.nonNull(balance)) {
            totalBalance += balance;
        }
    }

    // 返回合计余额
    return totalBalance;
}

特殊说明

其它方式:在循环体中,先调用案例1的函数getUserBalance(获取用户余额),再进行对余额进行累加。

在循环体中,建议最多使用一次continue。如果需要有使用多次continue的需求,建议把循环体封装为一个函数。

8.3 案例三:利用条件表达式函数减少层级

请参考下一章的"案例2: 把复杂条件表达式封装为函数"

8.4 主要收益

  • 代码层级减少,代码缩进减少;

  • 模块划分清晰,方便阅读维护。

9.

封装条件表达式函数


9.1 案例一:把简单条件表达式封装为函数

现象描述:

建议方案:

// 获取门票价格函数
public double getTicketPrice(Date currDate) {
    if (isDiscountDate(currDate)) {
        return TICKET_PRICE * DISCOUNT_RATE;
    }
    return TICKET_PRICE;
}

// 是否折扣日期函数
private static boolean isDiscountDate(Date currDate) {
    return Objects.nonNull(currDate) && 
currDate.after(DISCOUNT_BEGIN_DATE)
        && currDate.before(DISCOUNT_END_DATE);
}

9.2 案例二:把复杂条件表达式封装为函数

现象描述:

建议方案:

// 获取土豪用户列表
public List<User> getRichUserList(List<User> userList) {
    // 初始土豪用户列表
    List<User> richUserList = new ArrayList<>();

    // 依次查找土豪用户
    for (User user : userList) {
        // 判断土豪用户
        if (isRichUser(user)) {
            // 添加土豪用户
            richUserList.add(user);
        }
    }

    // 返回土豪用户列表
    return richUserList;
}

// 是否土豪用户
private boolean isRichUser(User user) {
    // 获取用户账户
    UserAccount account = user.getAccount();
    if (Objects.isNull(account)) {
        return false;
    }

    // 获取用户余额
    Double balance = account.getBalance();
    if (Objects.isNull(balance)) {
        return false;
    }

    // 比较用户余额
    return balance.compareTo(RICH_THRESHOLD) >= 0;
}

以上代码也可以用采用流式(Stream)编程的过滤来实现。

9.3 主要收益

  • 把条件表达式从业务函数中独立,使业务逻辑更清晰;

  • 封装的条件表达式为独立函数,可以在代码中重复使用。

10.

尽量避免不必要的空指针判断


本章只适用于项目内部代码,并且是自己了解的代码,才能够尽量避免不必要的空指针判断。对于第三方中间件和系统接口,必须做好空指针判断,以保证代码的健壮性。

10.1 案例一:调用函数保证参数不为空,被调用函数尽量避免不必要的空指针判断

现象描述:

建议方案:

// 创建用户信息
User user = new User();
... // 赋值用户相关信息
createUser(user);

// 创建用户函数
private void createUser(User user){
    // 创建用户信息
    userDAO.insert(user);
    userRedis.save(user);
}

10.2 案例二:被调用函数保证返回不为空,调用函数尽量避免不必要的空指针判断

现象描述:

建议方案:

// 保存用户函数
public void saveUser(Long id, String name) {
    // 构建用户信息
    User user = buildUser(id, name);

    // 保存用户信息
    userDAO.insert(user);
    userRedis.save(user);
}

// 构建用户函数
private User buildUser(Long id, String name) {
    User user = new User();
    user.setId(id);
    user.setName(name);
    return user;
}

10.3 案例三:赋值逻辑保证列表数据项不为空,处理逻辑尽量避免不必要的空指针判断

现象描述:

建议方案:

// 查询用户列表
List<UserDO> userList = userDAO.queryAll();
if (CollectionUtils.isEmpty(userList)) {
    return;
}

// 转化用户列表
List<UserVO> userVoList = new ArrayList<>(userList.size());
for (UserDO user : userList) {
    UserVO userVo = new UserVO();
    userVo.setId(user.getId());
    userVo.setName(user.getName());
    userVoList.add(userVo);
}

// 依次处理用户
for (UserVO userVo : userVoList) {
    // 处理相关逻辑
    ...
}

10.4 案例四:MyBatis查询函数返回列表和数据项不为空,可以不用空指针判断

MyBatis是一款优秀的持久层框架,是在项目中使用的最广泛的数据库中间件之一。通过对MyBatis源码进行分析,查询函数返回的列表和数据项都不为空,在代码中可以不用进行空指针判断。

现象描述:

这种写法没有问题,只是过于保守了。

建议方案:

// 查询用户函数
public List<UserVO> queryUser(Long id, String name) {
    // 查询用户列表
    List<UserDO> userList = userDAO.query(id, name);

    // 转化用户列表
    List<UserVO> voList = new ArrayList<>(userList.size());
    for (UserDO user : userList) {
        UserVO vo = new UserVO();
        BeanUtils.copyProperties(user, vo);
        voList.add(vo);
    }

    // 返回用户列表
    return voList;
}

10.5 主要收益

  • 避免不必要的空指针判断,精简业务代码处理逻辑,提高业务代码运行效率;

  • 这些不必要的空指针判断,基本属于永远不执行的Death代码,删除有助于代码维护。

640?wx_fmt=jpeg

相关推荐

让AI读懂代码需求:大模型微调训练实践及端侧运行部署

集团内部有多个微调训练的平台,譬如openLM, 魔搭平台的SWIFT等,集团外部有LLaMA-Factory,利用服务端共享的GPU集群进行训练,支持多种先进的微调算法和模型,适用于参数量大的复杂模型训练任务,但是对简单模型训练任务,希望在单机有限GPU资源下完成,并且缩短训练周期,基于这个考虑,选择了unsloth高性能训练框架。把代码知识图谱,分片存入向量数据库,通过RAG进行匹配查找,会存在召回率和准确率的问题,在实际过程中,LLM基于查询结果会存在不稳定的输出;

高德技术 790

高德沉浸式AI“云境”助力三维数字孪生

城市级数字孪生体,正是以强大仿真引擎与神经渲染等AI前沿技术基石、同时融合了(数据实时汇入环境、交通、能源、安防等)共同孕育的“智能生命体”,它超越了静态的“三维模型”,实时数据赋予了模型一系列“生命体征”,结合大数据分析与人工智能,实现对城市运行状态的动态监测、问题预警(如交通拥堵、内涝风险)、趋势推演(如人口流动、碳排放模拟)和策略优化(如信号灯配时、应急响应)。构建一个与现实城市一模一样的“镜像”,每盏路灯的能耗、每道车流的韵律、每片绿地的呼吸,都在镜像中实时搏动。

高德技术 2210

ICCV 2025|高德USP:图像生成与理解的统一自监督预训练

在将预训练模型权重适配到下游理解和生成模型时,针对图像分类任务,ViT 编码器的预训练权重可直接继承,无需额外调整,且仍然使用Class Token作为最终表征。USP 显著提升了 DiT 与 SiT 两个扩散模型的训练效率,仅用 600K 和 150K 步即可超越原始 7M 步的表现,分别加速 11.7× 和 46.6×,同时在图像识别任务中也保持了强大表示能力,具备良好的扩展性且无额外开销。同时,USP结合其他利用外部模型加速扩散模型收敛速度的方法,可以取得比单一方法更好的效果,表现出良好的正交性。

高德技术 904

生成模型双突破|高德技术如何让AI视频「更懂人」、图像「自愈」?

本文提出了首个人类感知对齐的视频运动质量评估基准 VMBench,受人类运动感知机制的启发,分层构建了五维度的运动感知评估指标 (PMM)体系和大规模的元信息引导提示生成 (MMPG)框架,覆盖了自然界中六大运动模式,为视频生成模型的运动质量评估树立了新的行业标准。传统研究侧重于特定任务的解决方案,采用设计的网络架构,使用相应的数据集对特定类型的退化进行优化。本研究提出了首个开源的、与人类感知对齐的视频运动质量评测基准VMBench,为社区提供了标准化的评测框架、可操作的诊断工具和量化的评估标准。

高德技术 1545

ICCV 2025|车道图的链式生成!高德将车道拓扑网学习革新为链式图扩展

在nuScenes和Argoverse 2数据集上进行的大量实验表明,与现有的基于检测和基于生成的方法相比,SeqGrowGraph在拓扑准确性和网络完整性方面表现出更优越的性能,通过引入类人结构化推理与序列建模,推动了车道图构建技术的发展,从而为动态环境下的自动驾驶提供精确的中心线。相比之下,SeqGrowGraph不仅提供了稳定和鲁棒的建模,还能有效合并地面实况数据中存在的冗余点,从而在构建车道图方面取得了更优越的结果,凸显了SeqGrowGraph在克服这些挑战方面的有效性和可靠性。

高德技术 977

高德测试体系智能化升级:AI驱动质量保障新范式

上面讲了通过构建生态化能力解决测试的质量、效率与管控的问题,起了一个好开始,用俗话说在“一盘棋”里,但什么时候能走到“天下大同”的局面,得一步步来,现在是 AI 博弈的一局,不敢说能“胜天半子”,但也不能 AI 过后一泻千里。事情可真不少,每个阶段就产生了完成各种“任务/工作项”的平台,以需求为事项跟踪的 Aone,以工作时序为主的五月花,现在团队项目管理的 Teambition,以测试专业为主的老 Kelude 到现在的 Aone,这还不包括有业务或团队特色的自己的任务平台。

高德技术 1502

技术思辨|AI Coding:经验壁垒正在失效,工具进化重塑编程

你能够将一个超级庞大的项目拆解成AI可以理解和逐步执行的细粒度任务,并预见在整合这些AI"零件"时可能出现的挑战和协同问题,这正是"1000倍杠杆"的起点。而"初生牛犊"则需要警惕,不能因为有了AI这个强大的工具就忽视了基础能力的培养、批判性思维的锻炼以及对问题本质的深入理解,否则可能永远停留在"能够使用AI的初学者"阶段,难以应对未来更复杂、更具挑战性的工作。能够洞察问题的本质,发现隐藏的关联,提出全新的思路,设计出AI都"想不到"的巧妙方案——这种源于人类灵感、直觉和想象力的创造力,是AI难以复制的。

高德技术 1161

全流程开源!高德3D贴图生成系统,白模一键生成真实感纹理贴图

我们团队自研的MVPainter系统,作为业内首个全流程开源的3D贴图生成方案,仅需一张参考图与任意白模,即可自动生成对齐精确、细节丰富、具备PBR属性的高质量贴图,全面提升3D内容生产效率与真实感表现,助力构建标准化、智能化的三维视觉基座。高质量数据构建与筛选流程:我们提出了一套自动化的数据筛选与增强Pipeline,针对公开3D数据中普遍存在的纹理缺失、光照,视角单一等问题,设计了贴图质量过滤、光照,视角增强等模块,用于构建一个高质量的多视角贴图训练集。

高德技术 1934

高德地图应用OceanBase单元化构建下一代在线地图服务

IEEE International Conference on Data Engineering (ICDE) 是数据库和数据工程领域的顶级学术会议之一(与SIGMOD、VLDB并成为数据库三大顶会),自1984年首次举办以来,每年举办一次。ICDE涵盖广泛的主题,包括数据库系统及其架构、数据管理与存储、大数据技术与应用、数据挖掘与知识发现、数据流处理与实时分析、分布式与并行数据库、数据隐私与安全等。本届会议接收到1518份投稿,共有300篇论文被接收发表,此外还包括10场Tutorials,11场wor

高德技术 1287

解锁高德语音包新玩法:这个六一,用孩子的声音,导航你的世界

因此,我们设计了Teacher - Force蒸馏的方案,通过同时约束蒸馏模型预测的声学特征和真实声学特征及基础模型预测的声学特征之间的误差,确保模型既可以较低难度的学习基础模型的声学输出,也可以同时保证蒸馏模型尽可能接近真实声学特征输出。第一阶段,我们首先会基于数千位高质量录音人的数据训练一个声学基础模型,模型在训练时,会对语义信息和说话人信息进行特征分离,以确保我们通过大规模数据进行预训练时可以充分实现说话人信息和语义信息的解耦,确保模型在微调阶段仅需调整少量的参数,加速模型产出的速度。

高德技术 2066

从底层重构强化学习训练框架,高德开源新方法

通过将基于组内的决策动态直接纳入标准的PG方法,GPG简化了训练过程,并显著减少了计算开销,而不削弱模型效果。这一突破为训练能够进行复杂推理的先进LLM提供了更高效的框架,从而为更具资源效率和可扩展性的人工智能系统做出了贡献。GPG开创性地从底层重构强化学习训练框架,仅需优化原始目标,解决已有方法偏差,提高训练效率。:首次揭示现有方法的奖励偏差问题,提出轻量化且高精度的梯度估计方案,显著提升策略稳定性。在一个组中,所有奖励都是0的简单问题的比例和所有奖励都是1的困难问题的比例。

高德技术 293

IJCAI 2025 | 高德首个原生3D生成基座大模型「G3PT」重塑3D生成的未来

该模型通过单张图像即可生成高质量3D Mesh,其核心创新之处在于提出了Cross-scale Querying Transformer模块,实现了3D 数据的多尺度1D Tokenizer,并且引入了Next-scale Autoregressive架构,取代了传统GPT中的Next-token Autoregressive架构,从而巧妙地解决了3D数据无序性这一长期困扰自回归建模的关键难题。它有效地解决了3D数据的无序性和多分辨率特性带来的挑战,实现了从粗到细的高质量3D内容生成,并支持多种条件模态。

高德技术 1718

高德开源数字人核心引擎,打造真实可控的音频驱动数字人

此外,我们集成了一个运动强度调制模块,显式控制表情和身体运动的强度,使肖像运动的操控不仅限于唇部动作。然而,自然说话头生成不仅需要关注与音频直接相关的唇部运动,还需关注与音频特征弱相关的其他面部组件和身体部位的运动(如眉毛、眼睛和肩膀)。为了解决这些限制,我们提出了一种新颖的框架,利用预训练的视频扩散变换模型生成高保真、连贯的说话肖像,并具备可控的运动动态。在与Hallo3的对比中,Hallo3的输出存在明显缺陷,对比的结果中Hallo3出现面部/唇部畸变和虚假背景运动和僵硬的头部运动。

高德技术 972

Tech Reader|高德技术人的灵感书单

在代码与算法的世界里,什么才是高德技术人「不迷路」的导航坐标?欢迎在评论区分享你对本期推荐书单的阅读心得或推荐你的灵感书单;在世界读书日,我们一起通过阅读校准下一段技术征程!答案或许藏在这份高德技术人的推荐书单里,选择5名粉丝随机送出本期推荐书籍!

高德技术 381

ICASSP 2025|高德推理检测助手和创新图像生成模型实力出圈

为了解决这些挑战,我们提出了一种创新的图像编辑框架,它利用Chain-of-Thought(CoT)推理和多模态大语言模型(LLMs)的定位能力来帮助扩散模型生成更精致的图像。大量的实验表明,我们的模型在图像生成方面在定性和定量上都超越了现有最先进的模型。本文提出了一种创新的图像编辑框架,该框架结合了链式思考(Chain-of-Thought, CoT)推理和多模态大型语言模型(Multimodal Large Language Models, MLLMs)的区域定位能力,以协助扩散模型生成更精细的图像。

高德技术 1756

CVPR 2025 Highlight|HumanRig:3D数字人黑科技,解锁更智能的3D角色动画框架

我们将分别介绍这些模块。这一优势主要归功于我们采用的基于Point Transformer的网格编码器,它能够有效区分不同身体部位的特征,从而生成更加精确的蒙皮权重分布,最终实现更高质量的网格变形效果。在这个过程中,我们确定粗略的三维骨架,通过计算每条射线与网格表面的交点,并使用每个三维粗略关节的第一次和最后一次交点的中点来得到结果。我们推出了一种创新的自动绑定算法,我们方法的核心模块包括:a)先验引导骨架估计器(PGSE),使用投射到3D空间中的2D先验初始化粗略骨架,显著降低绑定任务的复杂性。

高德技术 1963

高德视觉技术中心团队携CVPR论文成果亮相China3DV 2025

在"优秀论文Fastforward"环节,论文第一作者储泽栋通过现场演示与理论解析,详细展示了HumanRig技术创新,此研究不仅填补了3D人形角色绑定领域的数据集空白,还提出一种创新的自动绑定算法,推动动画行业向更高效、更自动化的角色绑定方向发展。高德视觉技术中心始终站在计算机视觉研究与应用的创新高地,是高德空间智能互联网领域重要的技术实践者。作为三维视觉领域年度盛会,本次高德视觉技术中心的创新成果展示,不仅彰显了团队在计算机视觉领域的技术积淀,更为行业提供了数字内容生产的革新方案。

高德技术 1109

技术公益|高德「卫星求救」与「无网导航」,用技术开拓无人区

无网导航通过技术保障用户体验。高德用户会在某些位置发起请求,如果是网络原因导致的请求失败,那就可以识别出来这块区域网络不顺畅,如果大量用户都在这里发出网络请求失败信息,就形成了我们所说的无网区域,用户本次导航途经无网区域,高德APP会提前缓存导航数据至后台,以备不时之需。高德通过与各大手机厂商的合作,接入厂商卫星能力SDK,统一接口标准,构建了一套通用化卫星通信解决方案,以此借助手机的硬件能力,建立与卫星的双向通信,将救援信号发送至卫星的同时也能从卫星接收对救援信息的回复,实现整个卫星救援能力上的闭环。

高德技术 1627

高德2025科研课题正式发布,研究型实习生岗位等你加入!

对于导航/定位地图而言,主要需要从众包数据中提取场景中对导航和定位重要的少量的稳定的信息,实景地图包含显著更多的细节,端云交互可以以更高效的隐式表达进行(类似Nerual Map),场景中的对象的几何和外观都可能发生显著的变化,这是实现大规模实景地图的众包渐进式构建与更新的核心难点。近年来,多模态大模型的兴起为这一领域提供了新的技术手段。这些技术的应用使平台和商家能够充分利用AI智能创作的能力,可以根据用户的特性,生成个性化的素材或者内容,高效地产出多样性的视觉效果,从而带来了巨大的商业价值。

高德技术 1501

高德终端技术总结:高可用架构如何练成?

在技术栈设计上,除调用系统平台服务的部分使用原生语言(Java//OC//ArtTS)外,其他均使用跨平台语言,来实现最大限度的跨平台,其中对于高性能要求的能力(如地图引擎、基础库)使用C++实现,而对于高效率要求的能力(如前端页面)则使用JS实现。稳定性工作属于「流水不腐,户枢不蠹」。高德地图作为国民级应用,特别是出行场景的独特性,要确保在线导航高并发和交通安全级的超稳定性,这对技术团队提出异乎寻常的高要求,无论是终端、云端,还是“终端-云端”之间的连接,都必须实现“高可用、高性能、高效率”的技术目标。

高德技术 1495

CVPR 2025|突破自动驾驶“交规困境“:高德车道级交通规则在线理解,让AI更懂交规!

其中 MEE 模型专门用于对矢量地图进行特征编码,将每个矢量点进行 tokenize,使用 learnable query 配合 Intra & Inter Instance Attention 进行矢量特征的聚合,融合后每个 query 对应一条矢量的特征信息。高德认为,遵守交通规则行驶是实现自动驾驶系统的必要条件,车道级交通规则通常包含在高精地图中,为自动驾驶系统提供了准确、可靠的规则指导。由人类驾驶过程的启发,从交通标志中理解交通规则需要完成两个任务,理解交通标志牌中指示的。

高德技术 961

CVPR 2025|突破自动驾驶“交规困境“:高德车道级交通规则在线理解,让AI更懂交规!

其中 MEE 模型专门用于对矢量地图进行特征编码,将每个矢量点进行 tokenize,使用 learnable query 配合 Intra & Inter Instance Attention 进行矢量特征的聚合,融合后每个 query 对应一条矢量的特征信息。高德认为,遵守交通规则行驶是实现自动驾驶系统的必要条件,车道级交通规则通常包含在高精地图中,为自动驾驶系统提供了准确、可靠的规则指导。由人类驾驶过程的启发,从交通标志中理解交通规则需要完成两个任务,理解交通标志牌中指示的。

高德技术 288

CVPR 2025|突破自动驾驶“交规困境“:高德车道级交通规则在线理解,让AI更懂交规!

其中 MEE 模型专门用于对矢量地图进行特征编码,将每个矢量点进行 tokenize,使用 learnable query 配合 Intra & Inter Instance Attention 进行矢量特征的聚合,融合后每个 query 对应一条矢量的特征信息。高德认为,遵守交通规则行驶是实现自动驾驶系统的必要条件,车道级交通规则通常包含在高精地图中,为自动驾驶系统提供了准确、可靠的规则指导。由人类驾驶过程的启发,从交通标志中理解交通规则需要完成两个任务,理解交通标志牌中指示的。

高德技术 181

CVPR 2025|突破自动驾驶“交规困境“:高德车道级交通规则在线理解,让AI更懂交规!

其中 MEE 模型专门用于对矢量地图进行特征编码,将每个矢量点进行 tokenize,使用 learnable query 配合 Intra & Inter Instance Attention 进行矢量特征的聚合,融合后每个 query 对应一条矢量的特征信息。高德认为,遵守交通规则行驶是实现自动驾驶系统的必要条件,车道级交通规则通常包含在高精地图中,为自动驾驶系统提供了准确、可靠的规则指导。由人类驾驶过程的启发,从交通标志中理解交通规则需要完成两个任务,理解交通标志牌中指示的。

高德技术 156

CVPR 2025|突破自动驾驶“交规困境“:高德车道级交通规则在线理解,让AI更懂交规!

其中 MEE 模型专门用于对矢量地图进行特征编码,将每个矢量点进行 tokenize,使用 learnable query 配合 Intra & Inter Instance Attention 进行矢量特征的聚合,融合后每个 query 对应一条矢量的特征信息。高德认为,遵守交通规则行驶是实现自动驾驶系统的必要条件,车道级交通规则通常包含在高精地图中,为自动驾驶系统提供了准确、可靠的规则指导。由人类驾驶过程的启发,从交通标志中理解交通规则需要完成两个任务,理解交通标志牌中指示的。

高德技术 223

CVPR 2025|突破自动驾驶“交规困境“:高德车道级交通规则在线理解,让AI更懂交规!

其中 MEE 模型专门用于对矢量地图进行特征编码,将每个矢量点进行 tokenize,使用 learnable query 配合 Intra & Inter Instance Attention 进行矢量特征的聚合,融合后每个 query 对应一条矢量的特征信息。高德认为,遵守交通规则行驶是实现自动驾驶系统的必要条件,车道级交通规则通常包含在高精地图中,为自动驾驶系统提供了准确、可靠的规则指导。由人类驾驶过程的启发,从交通标志中理解交通规则需要完成两个任务,理解交通标志牌中指示的。

高德技术 107

CVPR 2025|突破自动驾驶“交规困境“:高德车道级交通规则在线理解,让AI更懂交规!

其中 MEE 模型专门用于对矢量地图进行特征编码,将每个矢量点进行 tokenize,使用 learnable query 配合 Intra & Inter Instance Attention 进行矢量特征的聚合,融合后每个 query 对应一条矢量的特征信息。高德认为,遵守交通规则行驶是实现自动驾驶系统的必要条件,车道级交通规则通常包含在高精地图中,为自动驾驶系统提供了准确、可靠的规则指导。由人类驾驶过程的启发,从交通标志中理解交通规则需要完成两个任务,理解交通标志牌中指示的。

高德技术 298

CVPR 2025|突破自动驾驶“交规困境“:高德车道级交通规则在线理解,让AI更懂交规!

其中 MEE 模型专门用于对矢量地图进行特征编码,将每个矢量点进行 tokenize,使用 learnable query 配合 Intra & Inter Instance Attention 进行矢量特征的聚合,融合后每个 query 对应一条矢量的特征信息。高德认为,遵守交通规则行驶是实现自动驾驶系统的必要条件,车道级交通规则通常包含在高精地图中,为自动驾驶系统提供了准确、可靠的规则指导。由人类驾驶过程的启发,从交通标志中理解交通规则需要完成两个任务,理解交通标志牌中指示的。

高德技术 181

CVPR 2025|突破自动驾驶“交规困境“:高德车道级交通规则在线理解,让AI更懂交规!

其中 MEE 模型专门用于对矢量地图进行特征编码,将每个矢量点进行 tokenize,使用 learnable query 配合 Intra & Inter Instance Attention 进行矢量特征的聚合,融合后每个 query 对应一条矢量的特征信息。高德认为,遵守交通规则行驶是实现自动驾驶系统的必要条件,车道级交通规则通常包含在高精地图中,为自动驾驶系统提供了准确、可靠的规则指导。由人类驾驶过程的启发,从交通标志中理解交通规则需要完成两个任务,理解交通标志牌中指示的。

高德技术 439

CVPR 2025|突破自动驾驶“交规困境“:高德车道级交通规则在线理解,让AI更懂交规!

其中 MEE 模型专门用于对矢量地图进行特征编码,将每个矢量点进行 tokenize,使用 learnable query 配合 Intra & Inter Instance Attention 进行矢量特征的聚合,融合后每个 query 对应一条矢量的特征信息。高德认为,遵守交通规则行驶是实现自动驾驶系统的必要条件,车道级交通规则通常包含在高精地图中,为自动驾驶系统提供了准确、可靠的规则指导。由人类驾驶过程的启发,从交通标志中理解交通规则需要完成两个任务,理解交通标志牌中指示的。

高德技术 503
上一篇: 高德网络定位之“移动WiFi识别”
下一篇: 机器学习在交通标志检测与精细分类中的应用
高德技术
高德技术 企业官方账号 企业官方账号
博客等级 码龄7年 1270粉丝 146原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值