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

在这里插入图片描述

前言

Flutter 和 Dart 的标准库提供了 List, Map, Set 以及基本的 Math 库。这对于普通 APP 开发够用了。
但是,如果你要开发:

  • 一个高性能的游戏引擎(需要位运算、四叉树)。
  • 一个复杂的数据分析工具(需要统计学算法)。
  • 一个缓存系统(需要 LRU 策略)。
  • 一个自定义的解析器(需要字符集处理)。

标准库就显得捉襟见肘了。

more 是 Dart 社区中质量极高的一个工具库(作者是 Google 工程师)。它汇集了大量高效的数据结构、数学算法、迭代器扩展和缓存策略。它的座右铭是“更多功能,更少废话”。

对于 OpenHarmony 应用,尤其是涉及高性能计算或复杂逻辑处理的场景,more 是你不可或缺的军火库。

一、核心功能概览

这个库包含了几十个独立的模块,列举几个最常用的:

  1. Collections: BiMap (双向映射), Multiset (多集), IntegerRange
  2. Cache: LruCache, FifoCache, ExpiryCache
  3. Math: Fraction (分数), Complex (复数), Polynomial (多项式), BitList
  4. CharMatcher: 类似于 Java Guava 的字符匹配器,高效处理字符串。
  5. Printers: 强大的对象打印/格式化工具。

导入

数据结构

算法

工具

文本

Dart 应用

package:more

BiMap, Multiset...

Statistics, Digits...

LRU, Expiry...

字符串处理

二、集成与用法详解

2.1 添加依赖

dependencies:
  more: ^4.7.0

2.2 高效缓存 (Caching)

在鸿蒙开发中,为了优化性能,我们经常需要缓存计算结果或网络图片。more 提供了多种策略。

import 'package:more/cache.dart';

void main() async {
  // 创建一个容量为 100 的 LRU (Least Recently Used) 缓存
  // 当缓存满时,最近最少使用的数据会被剔除
  final cache = Cache<String, int>.lru(maxSize: 100);

  // 加载数据 (如果不存在则调用 loader)
  final value = await cache.get('key', () async {
    print('正在计算...');
    return 42;
  });
  
  print(value); // 42
}

在这里插入图片描述

2.3 双向映射 (BiMap)

有时候我们需要通过 ID 查 Name,也需要通过 Name 查 ID。标准的 Map 只能单向查,BiMap 支持双向。

import 'package:more/collection.dart';

void main() {
  final bimap = BiMap<int, String>();
  bimap[1] = '一';
  bimap[2] = '二';

  print(bimap[1]); // 一
  print(bimap.inverse['二']); // 2
}

在这里插入图片描述

2.4 迭代器魔法 (Iterables)

moreIterable 添加了大量扩展方法,类似于 RxDart 但同步执行。

import 'package:more/iterable.dart';

void main() {
  final list = [1, 2, 3, 4, 5];

  // 排列组合
  print(list.permutations(2)); // ((1, 2), (1, 3), ...)

  // 窗口滑动
  print(list.window(2)); // ([1, 2], [2, 3], [3, 4], [4, 5])
  
  // 无限生成器
  final fib = iterate(0, (a) => a + 1); // 0, 1, 2, ...
}

在这里插入图片描述

三、OpenHarmony 适配与实战:本地数据处理

在鸿蒙设备上,有时我们需要在本地处理大量传感器数据或日志,而不需要上传云端。

3.1 场景:数据去重与统计

假设我们从加速度传感器采集了一串数据,包含大量重复值,我们需要统计每个值出现的次数。

import 'package:more/collection.dart';

void processSensorData(List<int> rawData) {
  // Multiset (即 Bag) 能够记录元素出现的次数
  final histogram = Multiset<int>();
  histogram.addAll(rawData);

  // 打印出现次数最多的前 3 个值
  for (final value in histogram.distinct.take(3)) { // 需配合排序逻辑
    print('Value $value -> Count: ${histogram[value]}');
  }
}

在这里插入图片描述

3.2 场景:位图操作 (BitList)

在处理嵌入式协议或图片像素掩码时,List<bool> 太浪费内存了(一个 bool 占一个字节甚至更多)。BitList 用一个 bit 存一个 bool,极致省内存。

import 'package:more/collection.dart';

void bitOperations() {
  // 创建一个包含 1024 位(128 字节)的位图
  final bits = BitList(1024); 
  
  bits[10] = true;
  bits[100] = true;
  
  // 高效的位运算
  print(bits.test(10)); // true
  // bits.setAll(...)
}

在这里插入图片描述

四、功能详解:Printer

Printer 是 toString 的替代方案,能够组合式地格式化输出。

import 'package:more/printer.dart';

void main() {
  final printer = Printer.ofType<int>()
      .padLeft(4, '0') // 补零
      .around('(', ')'); // 包裹

  print(printer(42)); // (0042)
}

在这里插入图片描述

五、总结

more 库正如其名,给了你更多。它填补了 Dart 基本库在高级数据结构和算法方面的空白。

对于 OpenHarmony 开发者:

  • 如果你在移植 Java (Guava/Commons-Lang) 或 Python 的代码到 Dart,你会发现 more 里有很多熟悉的面孔。
  • 它纯 Dart 实现,无任何平台依赖,是提升代码质量和性能的通用利器。

最佳实践

  1. 按需引入:虽然库包含很多功能,但它模块化做得很好。了解你真正需要的模块(如只用 Cache)。
  2. 性能优先:在处理成千上万条数据时,优先考虑 more 提供的数据结构(如位图、特定集合),可能会带来数量级的性能提升。

六、完整实战示例

import 'package:more/collection.dart';
import 'package:more/math.dart';

void main() {
  print('=== 数据统计算法 ===');
  
  // 模拟一组实验数据
  final data = [10, 12, 10, 14, 12, 10, 15, 20];
  
  // 1. 统计频率 (Multiset)
  // 能够快速计算众数、频次
  final counts = Multiset<int>.from(data);
  // 找出出现次数最多的数字
  final mode = counts.distinct.reduce((a, b) => counts[a] > counts[b] ? a : b);
  
  print('数据: $data');
  print('众数 (Mode): $mode');
  print('数字 10 出现了 ${counts[10]} 次');

  
  print('\n=== 位操作 (BitList) ===');
  // 场景:签到系统,一年 365 天,每天只占 1 bit,极致省内存
  final checkIns = BitList(365);
  checkIns[0] = true; // 第1天签到
  checkIns[5] = true; // 第6天签到
  
  print('由于存储压缩,365天签到数据仅占用: ${checkIns.length ~/ 8 + 1} 字节');
  print('第6天是否签到: ${checkIns[5]}');
  print('总签到天数: ${checkIns.count(true)}');

  print('\n=== 排列组合 (Combinations) ===');
  final teams = ['红队', '绿队', '蓝队', '黄队'];
  // 生成所有可能的两两对战组合 (C(n, 2))
  final matches = teams.combinations(2);
  
  print('赛程表:');
  for (var match in matches) {
    print('${match.first} vs ${match.last}');
  }
}

在这里插入图片描述

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐