在这里插入图片描述

目录

  1. 概述
  2. 基础检查
  3. 高级查找
  4. 组合操作
  5. 实战案例
  6. 性能优化
  7. 常见问题

概述

本文档介绍如何在 Kotlin Multiplatform (KMP) 鸿蒙跨端开发中进行条件检查和查找操作。这些操作用于检查集合中是否存在满足条件的元素,或查找特定的元素。通过 KMP,这些操作可以无缝编译到 JavaScript,在 OpenHarmony 应用中高效运行。

为什么需要学习条件检查和查找操作?

  • 数据验证:验证数据是否满足条件
  • 数据查询:查找满足条件的元素
  • 业务逻辑:实现复杂的业务规则检查
  • 代码简洁:使用函数式操作比手写循环更简洁
  • 跨端兼容:这些操作在编译到 JavaScript 时表现出色,完美支持 OpenHarmony
  • 代码复用:一份 Kotlin 代码可同时服务多个平台

基础检查

any - 是否存在满足条件的元素

检查是否存在至少一个满足条件的元素。

val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

// 检查是否存在偶数
val hasEven = numbers.any { it % 2 == 0 }
println(hasEven)  // true

// 检查是否存在大于 20 的数字
val hasGreaterThan20 = numbers.any { it > 20 }
println(hasGreaterThan20)  // false

// 检查是否存在元素
val isEmpty = numbers.any()
println(isEmpty)  // true

all - 是否所有元素都满足条件

检查是否所有元素都满足条件。

val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

// 检查是否所有数字都为正数
val allPositive = numbers.all { it > 0 }
println(allPositive)  // true

// 检查是否所有数字都大于 5
val allGreaterThan5 = numbers.all { it > 5 }
println(allGreaterThan5)  // false

none - 是否没有元素满足条件

检查是否没有元素满足条件。

val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

// 检查是否没有负数
val noNegative = numbers.none { it < 0 }
println(noNegative)  // true

// 检查是否没有大于 20 的数字
val noGreaterThan20 = numbers.none { it > 20 }
println(noGreaterThan20)  // true

高级查找

find/findLast - 查找满足条件的元素

Kotlin 源代码
@OptIn(ExperimentalJsExport::class)
@JsExport
fun conditionCheckExample(): String {
    val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    val words = listOf("Apple", "Banana", "Cherry", "Date")
    
    // 检查是否存在满足条件的元素
    val hasEven = numbers.any { it % 2 == 0 }
    val hasGreaterThan20 = numbers.any { it > 20 }
    
    // 检查是否所有元素都满足条件
    val allPositive = numbers.all { it > 0 }
    val allGreaterThan5 = numbers.all { it > 5 }
    
    // 查找满足条件的元素
    val firstEven = numbers.find { it % 2 == 0 }
    val firstLongWord = words.find { it.length > 5 }
    
    return "数字: ${numbers.joinToString(", ")}\n" +
           "存在偶数: $hasEven\n" +
           "存在>20的数: $hasGreaterThan20\n" +
           "全部为正数: $allPositive\n" +
           "全部>5: $allGreaterThan5\n" +
           "第一个偶数: $firstEven\n" +
           "第一个长单词: $firstLongWord"
}
编译后的 JavaScript 代码
function conditionCheckExample() {
  var numbers = listOf_0([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
  var words = listOf_0(['Apple', 'Banana', 'Cherry', 'Date']);
  
  // 检查是否存在满足条件的元素
  var hasEven = any(numbers, function(it) { return (it % 2 | 0) === 0; });
  var hasGreaterThan20 = any(numbers, function(it) { return it > 20; });
  
  // 检查是否所有元素都满足条件
  var allPositive = all(numbers, function(it) { return it > 0; });
  var allGreaterThan5 = all(numbers, function(it) { return it > 5; });
  
  // 查找满足条件的元素
  var firstEven = find(numbers, function(it) { return (it % 2 | 0) === 0; });
  var firstLongWord = find(words, function(it) { return it.length > 5; });
  
  return '数字: ' + joinToString_0(numbers, ', ') + '\n' + 
         ('存在偶数: ' + hasEven + '\n') + 
         ('存在>20的数: ' + hasGreaterThan20 + '\n') + 
         ('全部为正数: ' + allPositive + '\n') + 
         ('全部>5: ' + allGreaterThan5 + '\n') + 
         ('第一个偶数: ' + firstEven + '\n') + 
         ('第一个长单词: ' + firstLongWord);
}
ArkTS 调用代码
import { conditionCheckExample } from './hellokjs';

@Entry
@Component
struct Index {
  @State message: string = '加载中...';
  @State results: string[] = [];

  aboutToAppear(): void {
    this.loadResults();
  }

  loadResults(): void {
    try {
      // 调用 Kotlin 编译的 JavaScript 函数
      const conditionCheckResult = conditionCheckExample();
      this.results = [conditionCheckResult];
      this.message = '案例已加载';
    } catch (error) {
      this.message = `错误: ${error}`;
    }
  }

  build() {
    Column() {
      Text('Kotlin 条件检查和查找演示')
        .fontSize(24)
        .fontWeight(FontWeight.Bold)
        .margin({ top: 20, bottom: 20 })

      Text(this.message)
        .fontSize(14)
        .fontColor(Color.Gray)
        .margin({ bottom: 15 })

      Scroll() {
        Column() {
          ForEach(this.results, (result: string) => {
            Text(result)
              .fontSize(12)
              .fontFamily('monospace')
              .padding(12)
              .width('100%')
              .backgroundColor(Color.White)
              .border({ width: 1, color: Color.Gray })
              .borderRadius(8)
          })
        }
        .width('100%')
        .padding({ left: 15, right: 15 })
      }
      .layoutWeight(1)
      .width('100%')

      Button('刷新结果')
        .width('80%')
        .height(40)
        .margin({ bottom: 20 })
        .onClick(() => {
          this.loadResults();
        })
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#f5f5f5')
  }
}
执行流程说明
  1. Kotlin 源代码:定义 conditionCheckExample() 函数,使用 any、all、find 进行条件检查和查找
  2. 编译过程:Gradle 使用 KMP 编译器将 Kotlin 代码编译成 JavaScript
  3. JavaScript 输出:编译器生成优化的 JavaScript 代码,使用内置函数实现条件检查逻辑
  4. ArkTS 调用:在 OpenHarmony 应用中导入并调用编译后的 JavaScript 函数
  5. 结果展示:在 UI 中显示条件检查结果

findLast - 查找最后一个满足条件的元素

val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

// 查找最后一个偶数
val lastEven = numbers.findLast { it % 2 == 0 }
println(lastEven)  // 10

// 查找最后一个大于 5 的数字
val lastGreaterThan5 = numbers.findLast { it > 5 }
println(lastGreaterThan5)  // 10

组合操作

条件检查和过滤组合

val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

// 检查是否存在偶数,如果存在则获取所有偶数
if (numbers.any { it % 2 == 0 }) {
    val evens = numbers.filter { it % 2 == 0 }
    println("偶数: $evens")
}

// 检查是否所有数字都大于 0,如果是则计算总和
if (numbers.all { it > 0 }) {
    val sum = numbers.sum()
    println("总和: $sum")
}

实战案例

案例:条件检查和查找操作的实际应用

在上面的"高级查找"部分已经展示了完整的三层代码示例(Kotlin、JavaScript、ArkTS)。这个 conditionCheckExample() 案例演示了:

  1. 基础检查:使用 any 和 all 进行条件检查
  2. 元素查找:使用 find 查找满足条件的元素
  3. 编译过程:展示了 Kotlin 代码如何编译成 JavaScript
  4. 实际调用:展示了如何在 ArkTS 中调用编译后的函数
扩展应用场景

在实际项目中,可以基于 conditionCheckExample() 的模式进行扩展:

  • 数据验证:验证用户输入是否满足条件
  • 权限检查:检查用户是否有特定权限
  • 状态检查:检查系统状态是否满足条件
  • 搜索功能:查找满足条件的数据

所有这些应用都遵循相同的 Kotlin → JavaScript → ArkTS 的编译和调用流程。


性能优化

1. 使用 any 代替 filter + isNotEmpty

// ✅ 好:使用 any
val hasEven = numbers.any { it % 2 == 0 }

// ❌ 不好:使用 filter
val hasEven = numbers.filter { it % 2 == 0 }.isNotEmpty()

2. 使用 all 代替 filter + size

// ✅ 好:使用 all
val allPositive = numbers.all { it > 0 }

// ❌ 不好:使用 filter
val allPositive = numbers.filter { it > 0 }.size == numbers.size

3. 使用 find 代替 filter + first

// ✅ 好:使用 find
val firstEven = numbers.find { it % 2 == 0 }

// ❌ 不好:使用 filter
val firstEven = numbers.filter { it % 2 == 0 }.firstOrNull()

常见问题

Q1: any、all、none 的区别是什么?

A:

  • any:是否存在满足条件的元素
  • all:是否所有元素都满足条件
  • none:是否没有元素满足条件
val numbers = listOf(1, 2, 3, 4, 5)

val hasEven = numbers.any { it % 2 == 0 }      // true
val allPositive = numbers.all { it > 0 }       // true
val noNegative = numbers.none { it < 0 }       // true

Q2: find 和 findLast 有什么区别?

A:

  • find:查找第一个满足条件的元素
  • findLast:查找最后一个满足条件的元素
val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

val firstEven = numbers.find { it % 2 == 0 }      // 2
val lastEven = numbers.findLast { it % 2 == 0 }   // 10

Q3: 如何处理 find 返回 null 的情况?

A: 使用 findOrNull 或 Elvis 操作符

val numbers = listOf(1, 3, 5, 7, 9)

// 使用 Elvis 操作符
val firstEven = numbers.find { it % 2 == 0 } ?: -1
println(firstEven)  // -1

// 使用 let
numbers.find { it % 2 == 0 }?.let { println(it) }

Q4: 条件检查操作的时间复杂度是多少?

A: 大多数操作的时间复杂度为 O(n)

val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

// 时间复杂度:O(n)
val hasEven = numbers.any { it % 2 == 0 }
val allPositive = numbers.all { it > 0 }
val firstEven = numbers.find { it % 2 == 0 }

Q5: 如何组合多个条件检查?

A: 使用逻辑操作符或链式调用

val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

// 方式 1:使用逻辑操作符
val hasEvenAndGreaterThan5 = numbers.any { it % 2 == 0 && it > 5 }

// 方式 2:链式调用
val hasEvenAndGreaterThan5_2 = numbers.any { it % 2 == 0 } && 
                                numbers.any { it > 5 }

总结

关键要点

  • any 用于检查是否存在满足条件的元素
  • all 用于检查是否所有元素都满足条件
  • none 用于检查是否没有元素满足条件
  • find 用于查找第一个满足条件的元素
  • findLast 用于查找最后一个满足条件的元素

下一步

  1. 学习更多高级条件检查技巧
  2. 实践复杂的查找场景
  3. 优化条件检查的性能
  4. 探索自定义条件检查扩展函数

参考资源

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

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐