Flutter for OpenHarmony:darq 让 Dart 拥有 C# LINQ 般的超能力(集合查询与变换神器) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:darq 让 Dart 拥有 C# LINQ 般的超能力(集合查询与变换神器) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net

在这里插入图片描述

Flutter for OpenHarmony:darq 让 Dart 拥有 C# LINQ 般的超能力(集合查询与变换神器) 深度解析与鸿蒙适配指南

前言

如果你是从 .NET/C# 转到 Dart/Flutter 开发的,你一定无比怀念 LINQ (Language Integrated Query)
虽然 Dart 的 Iterable 提供了 map, where, reduce 等基础方法,但在处理复杂数据集合(如多重排序、连接 Join、分组 GroupBy、去重)时,原生 API 依然显得力不从心,代码往往显得冗长且难以阅读。

darq 正是为此而生。它为 Dart 的 Iterable 添加了 60+ 个强大的扩展方法,完美复刻了 .NET LINQ 的体验。

对于 OpenHarmony 应用开发,前端往往需要处理来自后端的复杂 JSON 列表数据。使用 darq 可以在前端轻松完成类似于 SQL 的数据筛选与聚合,减轻 UI 层的逻辑负担。

一、核心功能概览

darq 的核心在于 Extension Methods。只需引入库,你的 List/Set/Iterable 就会瞬间多出几十种方法。

功能分类常用方法描述
筛选distinct, distinctBy强大的去重,支持自定义 Key。
排序orderBy, thenBy, orderByDescending多级排序(先按年龄排,再按姓名排)。
集合运算union, intersect, except并集、交集、差集。
分组聚合groupBy, aggregate类似于 SQL 的 Group By。
连接join, groupJoin类似于 SQL 的 Inner/Left Join。
统计average, sum, count数值统计。

darq 链式调用

原始 List

Where 过滤

OrderBy 排序

Select 映射

Distinct 去重

最终结果

二、OpenHarmony 适配说明

darq 是纯 Dart 逻辑库,不依赖任何平台特定 API(如 dart:io 或 dart:html)。
因此,它在 OpenHarmony 做到了100% 完美兼容,无需任何额外配置,直接在 pubspec.yaml 引入即可。

它特别适合鸿蒙上的以下场景:

  1. 电商应用:商品列表的多条件筛选与排序。
  2. 数据报表:本地计算总销售额、平均值等。
  3. 通讯录:按首字母分组 (groupBy) 联系人。

三、基础用例

3.1 多级排序 (Multi-level Sorting)

原生 Dart sort 很难写多级排序,darq 极其优雅:

import'package:darq/darq.dart';classPerson{finalString name;final int age;Person(this.name,this.age);@overrideStringtoString()=>'$name($age)';}voidmain(){var list =[Person('Bob',20),Person('Alice',20),Person('Charlie',30),];// 先按年龄升序,年龄相同的按名字降序var result = list.orderBy((p)=> p.age).thenByDescending((p)=> p.name);print(result);// (Alice(20), Bob(20), Charlie(30))}
在这里插入图片描述

3.2 集合交集与差集

voidsetOperations(){var listA =[1,2,3,4];var listB =[3,4,5,6];// 交集print(listA.intersect(listB));// (3, 4)// 差集 (A 有但 B 没有)print(listA.except(listB));// (1, 2)}
在这里插入图片描述

3.3 复杂去重 (DistinctBy)

voiddistinctExample(){var records =[{'id':1,'val':'a'},{'id':2,'val':'b'},{'id':1,'val':'c'},// ID 重复];// 按 ID 去重,保留第一个var unique = records.distinct((r)=> r['id']);print(unique);// ({id: 1, val: a}, {id: 2, val: b})}
在这里插入图片描述

四、完整实战示例:鸿蒙电商商品筛选

假设我们从服务器拉取了一个乱序的商品列表,需要在客户端实现:

  1. 过滤掉下架商品。
  2. 按类别分组。
  3. 每组内按价格从低到高排序。
  4. 计算每个类别的平均价格。
import'package:darq/darq.dart';classProduct{finalString name;finalString category;final double price;final bool isAvailable;Product(this.name,this.category,this.price,this.isAvailable);@overrideStringtoString()=>'$name: ¥$price';}voidmain(){// 1. 模拟原始数据final products =[Product('Mate 60','Phone',6999,true),Product('Pura 70','Phone',5999,true),Product('Old Phone','Phone',2999,false),// 下架Product('FreeBuds','Audio',899,true),Product('Sound X','Audio',1999,true),Product('Watch GT','Wearable',1488,true),];print('=== 原始数据 ==='); products.forEach(print);// 2. 使用 darq 进行复杂查询var query = products // Step A: 过滤下架商品.where((p)=> p.isAvailable)// Step B: 按价格排序.orderBy((p)=> p.price)// Step C: 按类别分组.groupBy((p)=> p.category);print('\n=== 处理结果 (按类别分组且已排序) ===');for(var group in query){// group.key 是类别名,group 是该类别下的商品 Iterable// Step D: 计算分组平均价var avgPrice = group.average((p)=> p.price);print('\n📂 类别: ${group.key}');print(' 平均价: ¥${avgPrice.toStringAsFixed(2)}');print(' 商品列表:');for(var p in group){print(' - ${p.name} (¥${p.price})');}}// 3. 额外功能:获取最贵的商品var mostExpensive = products.where((p)=> p.isAvailable).orderByDescending((p)=> p.price).firstOrDefault();print('\n🏆 最贵的在售商品: ${mostExpensive?.name} (¥${mostExpensive?.price})');}
在这里插入图片描述

五、总结

darq 是那种“一旦用了就回不去”的库。它极大地提升了 Dart 集合操作的表达力,让代码逻辑从“命令式”(怎么循环、怎么判断)转变为“声明式”(我要什么数据)。

对于 OpenHarmony 应用中的数据驱动型 UI(如列表页、Dashboard),使用 darq 能显著减少样板代码,让业务逻辑清晰得像在读说明书。强烈推荐将其纳入你的鸿蒙开发标准库中。

Read more

【排序算法全家桶 Level 3】交换排序:从冒泡优化到快排四重奏

【排序算法全家桶 Level 3】交换排序:从冒泡优化到快排四重奏

🏠 个人主页:EXtreme35 📚 个人专栏: 专栏名称专栏主题简述《C语言》C语言基础、语法解析与实战应用《数据结构》线性表、树、图等核心数据结构详解《题解思维》算法思路、解题技巧与高效编程实践 目录 * 一、 冒泡排序 * 1.1 算法思想:气泡升腾的奥秘 * 1.2 为什么你的冒泡排序总是比别人慢? * 1.3 代码实现 * 二、快速排序 * 2.1 初始版本:Hoare 版 * 2.1.1 初始代码 * 2.1.2 优化一:三数取中 * 2.1.2 优化二:小区间优化 * 2.2

By Ne0inhk
计算机视觉热点:三维人体姿态估计的前沿算法与论文案例

计算机视觉热点:三维人体姿态估计的前沿算法与论文案例

计算机视觉热点:三维人体姿态估计的前沿算法与论文案例 * 一、前言 * 二、三维人体姿态估计概述 * 2.1 定义与目标 * 2.2 应用场景 * 2.3 面临的挑战 * 三、前沿算法介绍 * 3.1 基于深度学习的方法 * 3.2 多视角方法 * 3.3 结合传感器的方法 * 四、算法对比与分析 * 4.1 不同算法的性能比较 * 4.2 适用场景分析 * 五、数据集介绍 * 5.1 常用数据集概述 * 5.2 数据集特点与应用 * 六、未来发展趋势 * 6.1 算法优化方向 * 6.2 新兴技术融合

By Ne0inhk
哈希表的介绍和使用

哈希表的介绍和使用

一.哈希表的概念   哈希又称散列,本质是通过一种键值对存储的高校组织方式。通过一个哈希函数,将数据的关键字直接映射到存储的数据中,实现快速的定位。   就像在图书馆中可以根据图书的编号来快速查找图书的位置。 二.直接定址法   直接借用关键字作为存储位置的下标, class Solution { public:     int first(string s) {         int count[26] = { 0 };         for (auto e : s) {             count[e - 'a']++;         }         for (size_t i = 0; i < s.size(); i++) {             if (count[s[i] - 'a'

By Ne0inhk
【算法通关指南:数据结构与算法篇】二叉树相关算法题:1.美国血统 American Heritage 2.二叉树问题

【算法通关指南:数据结构与算法篇】二叉树相关算法题:1.美国血统 American Heritage 2.二叉树问题

🔥小龙报:个人主页 🎬作者简介:C++研发,嵌入式,机器人方向学习者 ❄️个人专栏:《算法通关指南》 ✨ 永远相信美好的事情即将发生 文章目录 * 前言 * 一、美国血统 American Heritage * 1.1题目 * 1.2 算法原理 * 1.3代码 * 二、 二叉树问题 * 2.1题目 * 2.2 算法原理 * 2.3代码 * 总结与每日励志 前言 本专栏聚焦算法题实战,系统讲解算法模块:以《c++编程》,《数据结构和算法》《基础算法》《算法实战》 等几个板块以题带点,讲解思路与代码实现,帮助大家快速提升代码能力ps:本章节题目分两部分,比较基础笔者只附上代码供大家参考,其他的笔者会附上自己的思考和讲解,希望和大家一起努力见证自己的算法成长 一、

By Ne0inhk