HarmonyOS Next迭代器模式:for-in与区间遍历秘笈

手把手教你华为鸿蒙开发之第七节 遍历数组和对象以及在UI中渲染数据是鸿蒙开发中的重要技能。通过本文的详细介绍和示例,你应该能够掌握这些技能,并在实际开发中灵活运用。如果你有任何问题或想要进一步讨论,欢迎在评论区留下你的想法。以上就是一篇关于华为鸿蒙开发中数组和对象遍历及UI渲染的详细教程。希望这篇文章能帮助你更好地理解和使用华为鸿蒙开发中的相关功能。如果你在使用 DevEco Studio 进行开发时遇到任何问题,欢迎交流讨论。 阅读详情

在HarmonyOS Next的仓颉语言开发中,迭代器模式是实现数据遍历的重要手段,for-in表达式作为其关键实现方式,为开发者提供了简洁且强大的遍历功能。作为在该领域积累了丰富实践经验的技术人员,下面我将深入剖析for-in表达式与区间遍历的核心要点,分享其中的技巧与原理。

一、Iterable接口规范

(一)自定义类型实现迭代器案例

在仓颉语言中,for-in表达式能够遍历那些扩展了迭代器接口Iterable的类型实例。这一特性不仅适用于内置类型,也为自定义类型提供了统一的遍历方式。以自定义的链表类型为例:

class Node<T> {
    var value: T
        var next: Node<T>?
    init(_ value: T) {
            this.value = value
                    this.next = null
                        }
                        }
class LinkedList<T>: Iterable<T> {
    var head: Node<T>?
        var tail: Node<T>?
    init() {
            this.head = null
                    this.tail = null
                        }
    func add(_ value: T) {
            let newNode = Node(value)
                    if (this.tail == null) {
                                this.head = newNode
                                            this.tail = newNode
                                                    } else {
                                                                this.tail!.next = newNode
                                                                            this.tail = newNode
                                                                                    }
                                                                                        }
    func iterator(): Iterator<T> {
            return LinkedListIterator(this.head)
                }
                }
class LinkedListIterator<T>: Iterator<T> {
    var current: Node<T>?
    init(_ node: Node<T>?) {
            this.current = node
                }
    func hasNext(): Bool {
            return this.current!= null
                }
    func next(): T {
            let value = this.current!.value
                    this.current = this.current!.next
                            return value
                                }
                                }
                                ```
                                在上述代码中,`LinkedList`类实现了`Iterable<T>`接口,通过`iterator`方法返回一个实现了`Iterator<T>`接口的迭代器对象`LinkedListIterator`。这样,就可以使用for-in表达式遍历`LinkedList`:
                                ```cj
                                main() {
                                    let list = LinkedList<Int>()
                                        list.add(1)
                                            list.add(2)
                                                list.add(3)
                                                    for (num in list) {
                                                            println(num)
                                                                }
                                                                }
                                                                ```
                                                                通过自定义类型实现迭代器接口,不仅可以复用for-in表达式的便利,还能将复杂的数据结构遍历逻辑封装起来,提高代码的可读性和可维护性。
## 二、元组解构技巧
### (一)坐标数组遍历的元组拆包示例
当使用for-in表达式遍历元素为元组类型的序列时,元组解构技巧能让我们方便地获取元组中的各个元素。例如,在处理坐标数组时:
```cj
main() {
    let coordinates = [(1, 2), (3, 4), (5, 6)]
        for ((x, y) in coordinates) {
                println("坐标: (\(x), \(y))")
                    }
                    }
                    ```
                    在这个例子中,`(x, y)`就是元组解构的写法,它将`coordinates`数组中的每个元组元素拆分成`x`和`y`两个变量,方便在循环体中使用。这种方式避免了手动访问元组元素的繁琐操作,使代码更加简洁直观。在实际开发中,处理类似的结构化数据时,元组解构能大大提高开发效率,减少错误发生的概率。
## 三、where条件过滤
### (一)奇数筛选器的编译器优化原理
仓颉语言的for-in表达式支持在遍历序列时使用where关键字添加过滤条件。以筛选奇数为例:
```cj
main() {
    for (i in 0..8 where i % 2 == 1) {
            println(i)
                }
                }
                ```
                在这个例子中,`where i % 2 == 1`表示只遍历0到8之间的奇数。从编译器优化角度来看,这种方式在编译阶段就可以对遍历逻辑进行优化。编译器可以在生成代码时,直接跳过不满足条件的元素,而不需要在每次循环时都进行条件判断,从而提高遍历效率。与在循环体内部使用if语句进行筛选相比,`where`条件过滤减少了不必要的分支跳转和条件判断开销,使代码执行更加高效。在处理大规模数据遍历且需要进行条件筛选的场景中,合理使用`where`条件能显著提升程序性能。
掌握for-in表达式与区间遍历的这些关键要点,能够让开发者在HarmonyOS Next的仓颉语言开发中更加高效地处理数据遍历任务。无论是自定义类型的遍历,还是复杂数据结构的处理,这些技巧都能为代码的编写和优化提供有力支持。 
HarmonyOS NEXT应用开发之ForEach:循环渲染 ForEach接口基于数组类型数据来进行循环渲染,需要与容器组件配合使用,且接口返回的组件应当是允许包含在ForEach父容器组件中的子组件。例如,ListItem组件要求ForEach的父容器组件必须为 List组件。从API version 9开始,该接口支持在ArkTS卡片中使用。 阅读详情

相关推荐

第10篇:打包上架:签名、打包 HAP、发布到华为应用市场

打包上架:签名、打包 HAP、发布到华为应用市场

信息安全领域优质创作者|操作系统领域专家 78

鸿蒙NEXT版实战开发:如何实现相机关闭?

如何实现相机关闭.........

qq_39652397的博客 788

auto.js梦幻西游游戏脚本,梦幻西游脚本开发思路

本篇文章给大家谈谈梦幻西游脚本用什么语言写,以及auto.js梦幻西游游戏脚本,希望对各位有所帮助,不要忘了收藏本站喔。

npy199331的博客 1939

Dart基础第一篇:Dart的集合的循环遍历

void main(){ List list = ['香蕉','苹果','梨']; /** * 遍历list的三种方法 */ //第一种 for循环 for(int i=0;i<list.length;i++){ print(list[i]); } print("----分割线----"); //第二种 foreach for (v...

一花一世界 一叶一菩提 1万+

【七】Hadoop3.3.4基于ubuntu24的分布式集群安装

本次安装实验基于苹果m2芯片的mac系统,使用vmware fusion搭建三台ubuntu24分布式虚拟机,确保在三台机器上安装了Java jdk8,并配置了免密码登录,网络互通,防火墙关闭,授时服务器已经同步。访问apche官网源,下载3.3.4版本,我们用二进制通用版即可,因为hadoop运行在java环境,跨平台性使得无需编译arm架构版本。至此,Hadoop的安装完成,包括hdfs文件存储系统,mapreduce计算框架,yarn资源管理系统均能正常、稳定使用。

qq_31412425的博客 2160

GraphSense介绍

GraphSense是一个跨账本加密货币分析平台 它的介绍在这里 代码也是开源的 graphsense-dashboard 用于交互式加密货币分析的Web仪表板。 可以看导进数据的情况 graphsense-transformation 基于spark/cassandra/java服务运行 GraphSense转换管道,用于将加密货币的区块/交易/标签等数据导入,可以看它指定的json格式: t...

幸福诗歌的博客 1081

字节大牛教你手撕Android学习,赶快收藏备战金九银十!

开头 今年的金九银十来得比以往要晚一些,但每到“金九银十”的季节,总人很多人去寻找名叫“面经”一样的东西,其实就是一个个具体的题目,然后临阵磨枪,去“背”答案,如果一直是这样的话,我相信你的能力不会有任何提高,即使工作三年五年也达不到高级工程师的水平,事实证明这类“程序员”占大多数。而且我认为一个“面经”真正有价值的内容是面试前你是如何学习的,面试中面对不会的题目你是如何回答的,以及面试后的你的感受和总结,而不是冷冰冰的罗列题目。 刚入行,如何在前端岗位深耕? 有点基础的初级朋友们,切记一定要系统地学习移

m0_57066056的博客 370

【多媒体交互】Unity+普通摄像头实现UI事件分析

利用摄像头捕捉用户的手势或动作,结合坐标映射与事件系统触发UI交互

qq_38350004的博客 1315

鸿蒙5.0开发【如何遍历JSON对象】应用运维

【代码】鸿蒙5.0开发【如何遍历JSON对象】应用运维。

鸿蒙的技术博客 209

C#与发那科机器人通信实战:从SDK配置到机械臂控制

本文详细介绍了如何使用C#与发那科机器人进行通信,从SDK配置到机械臂控制的完整实战流程。内容包括环境准备、通信连接建立、机械臂运动控制、异常处理与状态监控,以及高级功能实战,帮助开发者快速掌握工业机器人编程技术。

weixin_42524276的博客 458

Debian下Rust环境极速安装指南:国内镜像+避坑配置(附清华/中科大源对比)

本文详细介绍了在Debian系统上快速安装和配置Rust开发环境的完整指南。针对国内网络环境,重点对比评测了清华大学、中国科学技术大学等主流镜像源,提供了详细的安装配置步骤、Cargo优化技巧以及常见问题排查方案,帮助开发者显著提升依赖下载和编译效率。

s8t9u0v1w的博客 1161

HarmonyOS 线性容器Deque 常用的几个方法

Deque允许在两端执行增删元素的操作,Queue只能在头部删除元素,尾部增加元素。 线性容器Deque 1.constructor 2.insertFront 3.insertEnd 4.has 5.popFirst 6.popLast 7.forEach 8. getFirst 9.getLast 10.Symbol.iterator

m0_53992752的博客 1208

STM32L476低功耗实战:LPTIM精准定时唤醒STOP2模式与系统级功耗优化

本文深入探讨了STM32L476低功耗实战技巧,重点解析了LPTIM精准定时唤醒STOP2模式的配置与优化。通过详细的步骤指南和实战经验分享,帮助开发者实现系统级功耗优化,特别适合电池供电设备开发。文章涵盖LPTIM1定时器配置、STOP2模式进入流程及常见问题排查,助力将整机功耗降至8.2uA级别。

weixin_33686714的博客 435

鸿蒙仓颉语言【循环for-while】

基本的高级语言的特性,都少不了for 和while,仓颉也不例外,在仓颉中。

鸿蒙的技术博客 783

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【HarmonyOS NEXT】鸿蒙线程安全容器集collections.Map

从API version 12 开始,该接口支持在元服务中使用。:从API version 12 开始,该接口支持在元服务中使用。:从API version 12 开始,该接口支持在元服务中使用。:从API version 12 开始,该接口支持在元服务中使用。:从API version 12 开始,该接口支持在元服务中使用。:从API version 12 开始,该接口支持在元服务中使用。:从API version 12 开始,该接口支持在元服务中使用。向该Map添加或更新一个指定的键值对。

wu1004019946的博客 1270

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

iterable、iterator和iter()

iterable、iterator和iter()的详细介绍及举例。 另外涉及:sequence以及immutable类型的定义、collection及container的定义。

freeline的博客 1780

rust: Iterator Pattern

本项目基于迭代器模式构建珠宝库存盘点系统,核心在于将“走法”与“筛选”作为可组合的数据,实现五种走法同时遍历同一台账。通过游标契约设计,确保集合不持有位置状态,游标独立维护推进状态,避免共享状态导致的副作用。关键创新包括:统一舍入逻辑(divide_rounded)防止口径漂移;以整数毫克/分存储金额,全程避免浮点误差;通过审计规则(如步态记账闭合、无凭空产出)保障遍历正确性;并以“反例对照组”量化位置共享的代价。最终形成可扩展、可验证、可复现的盘点体系。

Geovin Du Dream Park 150

11、设计模式应用举例:迭代器模式:使用多个集合存储对象

本文设计并实现了一个基于迭代器模式的学生信息管理系统。使用链表存储学生数据,通过散列表快速查询指定学号学生,利用树集按成绩自动排序。系统支持添加、查找及按分数升序输出学生信息,体现了迭代器模式在遍历与数据组织中的高效应用。

博风_刺耳的博客(网络记事本) 88

华为昇腾910B4(A2)服务器环境搭建笔记

Qwen3.5 默认支持思考模式。首次测试建议关闭思考模式,更容易判断模型是否成功回答。我建议把模型统一存放在宿主机的 /data/models 目录中。这样即使删除 Docker 容器,模型文件也不会丢失。这里先进行单卡测试,确保容器能正确调用 NPU。安装ModelScope 用于下载模型。继续在刚才的容器内部执行。

guoqingru0311的博客 296

IPD咨询洞察:华为项目文化:让胜利成为一种信仰

华为“让胜利成为信仰”的本质是使命必达,落地为五项内核:开放创新、勇于担当、团队协同、契约精神、善思善结。使命必达不能停留在墙面标语,须转化为可落地、可考核的行为准则,胜利才能真正成为团队习惯。

weixin_58096508的博客 102

手头只有华为配置,新设备是华三?粘进来自动翻

手头有华为配置,新设备是华三?用「跨厂商转换」工具,粘贴配置后自动识别源厂商,一键转成目标厂商语法,支持华为、华三、锐捷、迈普、思科等主流设备。精准处理VLAN、access/trunk口、SVI IP、VTY/SSH等差异,避免手动修改时漏改“拼写级”错误。转换后需人工核对核心项与独有特性,建议结合备份、比对与模拟验证,确保安全上机。

qq_42614669的博客 389

【2026-11-06】华为研发机试三道编程题解

本文整理了华为11月6日研发岗三道编程题解法:第一题为按列填充句子,通过枚举行数模拟列宽计算,求最小行数;第二题为生鲜库存优化,利用动态分配思想,预处理“采购-销售”成本,贪心选择最便宜来源满足需求;第三题涉及AC自动机与动态规划结合的序列化奖励问题。代码均以Java实现,思路清晰,适合笔试刷题参考。关注公众号【TechGuide】获取更多真题解析。

试问道几许 360

华为HCIP网络工程师认证—网络管理与运维

随着网络的规模越来越庞大,网络中的设备种类繁多,如何对越来越复杂的网络进行有效的管理,从而提供高质量的网络服务,已成为网络管理所面临的巨大挑战。网络的管理与运维手段多样,本博客将对几种网络管理与运维手段展开介绍。网络管理与运维,就是让你从“一台一台跑去敲命令的消防员”,变成“坐在总控室看大屏的指挥官”的一套技术体系。 它的核心目标就四个字:可视、可控——你得先“看见”网络在发生什么,然后才能“控制”它不出事。网络管理与运维,在 HCIP 里不像 OSPF、VLAN 那样需要算得很深,但它是一个“框架性”……

极客园地 246

华为VXLAN OVER EVPN(EBGP)

本文基于 eNSP Pro 模拟器,完整复现 Spine-Leaf 架构下 VXLAN over EVPN 的二层互通实验。实验目标是:通过 EBGP 在 Spine 与 Leaf 之间建立 Underlay 路由,再借助 BGP EVPN 承载 VXLAN 隧道,最终实现跨 Leaf 的同一子网二层互通,并验证头端复制(Head-End Replication)方式的 BUM 流量转发。

257

华为云云硬盘 EVS:挂载、初始化与快照回滚,一块数据盘的完整生命周期

一块云硬盘的生命周期是「买 → 挂 → 初始化 → 用 → 卸 → 再挂」。Windows 靠磁盘管理初始化、靠脱机保证能换机;Linux 靠。

xbzb的博客 707
上一篇: HarmonyOS Next循环编程艺术:while/do-while性能对比
下一篇: HarmonyOS Next程序结构设计:全局与局部作用域掌控
SameX-4869
博客等级 码龄18年 3354粉丝 657原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值