整体
Kotlin
// ==========================================
// 1. 包声明与导入 (Package & Imports)
// ==========================================
package com.mobile.agent
import java.util.Random // Kotlin 可以完美无缝地调用所有 Java 类库
// ==========================================
// 2. 数据类 (Data Class) --- 极其适合用来封装智能体的各种"状态"或"消息"
// ==========================================
// 【Java 对照】: 过去需要写 50 行代码
//(Getter/Setter/toString/equals/hashCode),或者用 Lombok 的 @Data
// 【Python 对照】: 相当于 Python 的 `@dataclass`和pydantic(?不确定)
// 【关键特性】: `String?` 这里的问号代表该字段"可为空",相当于 Python 的 `str | None` 或 `Optional[str]`
data class BotConfig(
val id: String, // val = 只读变量(Java 的 final,Python 无原生对应)
val modelName: String,
var temperature: Double = 0.7 // var = 可变变量;`= 0.7` 表示默认参数(Java原生不支持默认参数,Python支持)
)
// ==========================================
// 3. 顶层函数 (Top-level Function) --- 告别 Java 的"一切皆在类中"的限制
// ==========================================
// 【Java 对照】: 相当于工具类里的 public static 方法,如 Math.abs()
// 【Python 对照】: 正常的 `def` 函数
fun getWelcomeMessage(bot: BotConfig): String {
// 字符串模板:直接用 $ 注入变量,大括号内可写表达式
// 【Java】: "Bot: " + bot.getModelName() + " is ready."
// 【Python】: f"Bot: {bot.modelName} is ready."
return "智能体 [${bot.modelName}] 已就绪,当前温度系数: ${bot.temperature}"
}
// ==========================================
// 4. 程序入口 (Main Function)
// ==========================================
fun main() {
// 【实例化对象】: Kotlin 不需要写 `new` 关键字
// 【Java】: BotConfig agent1 = new BotConfig("001", "GPT-4", 0.5);
// 【Python】: agent1 = BotConfig("001", "GPT-4", 0.5)
val agent1 = BotConfig("001", "Qwen-Agent", 0.5)
val agent2 = BotConfig("002", "DeepSeek-Mobile") // 触发默认参数 temperature = 0.7
// 快捷创建不可变列表 (Java 需要 List.of,Python 直接 [item1, item2])
val agents = listOf(agent1, agent2)
println(getWelcomeMessage(agent1))
// ==========================================
// 5. 循环、空安全与分支控制 (Loop, Null Safety & When)
// ==========================================
for (agent in agents) {
// 修改 var 变量(如果是 val 编译会报错)
agent.temperature = 0.2
// 【空安全核心】:
// ?. 是安全调用符:如果 agent 整体或某个属性为 null,不报空指针异常(NPE),直接返回 null
// ?: 是 Elvis 操作符(绝对防御):如果左边算出来是 null,就采用右边的默认值
// 【Java】: agent.getModelName() != null ? agent.getModelName().toUpperCase() : "UNKNOWN"
// 【Python】: agent.modelName.upper() if agent.modelName is not None else "UNKNOWN"
val nameInCaps = agent.modelName.uppercase() ?: "UNKNOWN"
// 【when 表达式】: 功能极强的分支
// 【Java】: switch-case 的史诗级增强版(支持任意类型、支持表达式)
// 【Python】: Python 3.10 引入的 `match-case`
when {
agent.temperature < 0.5 -> println("$nameInCaps: 当前处于精准生成模式")
agent.temperature == 0.7 -> println("$nameInCaps: 当前处于标准平衡模式")
else -> println("$nameInCaps: 当前处于发散创造模式")
}
}
// ==========================================
// 6. 高阶函数与 Lambda 表达式 (数据清洗/采集高频使用)
// ==========================================
// 筛选出 temperature 小于 0.6 的智能体名字
// 【Java】: agents.stream().filter(a -> a.getTemperature() < 0.6).map(BotConfig::getModelName).collect(...)
// 【Python】: [a.modelName for a in agents if a.temperature < 0.6] (列表推导式)
val preciseMethodNames = agents
.filter { it.temperature < 0.6 } // `it` 是 Kotlin 中 Lambda 表达式只有一个参数时的默认别名
.map { it.modelName }
println("精简模式智能体列表: $preciseMethodNames")
}
一、变量
1、kotlin需要通过 val(不可变)、var(可变)进行定义变量。
2、定义过程和py相似,编译器自动识别类型,也可提前定义变量类型。
3、字符串变量定义:String、String?,其中带?表示该字符串可null。
4、字符串模版(格式化字符串):通过*变量* ,可以直接在字符串中引用该变量,*{name.length}*可以引用该变量的属性。
5、特殊基类定义:Any------可以是任意类型,类似【Java】Object 【Python】object;Unit------相当于 Java 的 void,Python 的 None,通常作为无返回值函数的返回类型
Kotlin
val count = 10 // 自动推导为 Int,无需显式写 : Int
val price = 99.9 // 自动推导为 Double
val name = "Agent" // 自动推导为 String
val readOnly: String = "我是只读的" // 【Java】final String 【Python】常量约定
// readOnly = "修改" // ❌ 编译报错:Val cannot be reassigned
var mutable: String = "我是可变的" // 【Java】String 【Python】普通变量
mutable = "我被修改了!" // 完全合法
var mutable: String? = "我是可变的,且可为null"
val intNum: Int = 42 // 32位整型
val longNum: Long = 123456789L // 64位长整型,末尾须加 L
val floatNum: Float = 3.14f // 32位浮点数,末尾须加 f
val doubleNum: Double = 3.1415926 // 64位浮点数
val isAiActive: Boolean = true // 布尔值 (注意:小写 true)
val charType: Char = 'A' // 单字符,必须用单引号
// 4.1 字符串模板 (String Interpolation)
val version = "v1.0"
val templateStr = "当前版本: $version, 名字长度: ${name.length}"
// 7. 特殊底层基类定义
val anyValue: Any = "可以是任意类型" // 【Java】Object 【Python】object
val unitValue: Unit = Unit // 相当于 Java 的 void,Python 的 None,
//通常作为无返回值函数的返回类型
1.1 定义Java File变量与惰性加载
// 6.2 惰性加载/懒汉式初始化 (by lazy) — 专用于 val 变量
// 场景:这个变量的创建非常消耗系统资源(比如读取本地大模型权重文件),我希望“只有在第一次用到它的时候”才去真正加载它。
Kotlin
import java.io.File
// 6.2 惰性加载/懒汉式初始化 (by lazy) --- 专用于 val 变量
// 场景:这个变量的创建非常消耗系统资源(比如读取本地大模型权重文件),我希望"只有在第一次用到它的时候"才去真正加载它。
val bigModelFile: File by lazy {
println("🚀 [警告] 正在初次加载巨大的模型文件,耗时严重...") // 只有第一次访问 bigModelFile 时才会打印
File("/sdcard/model.onnx")
}
1.2 .trimIndent()
.trimIndent() 用于自动去除前导空格,也就是编辑器中的缩进。
注意这里"""和python中"""的区别,这里是会把缩进也作为字符串内容。
Kotlin
fun main() {
val price=1.23
val jsonPrompt: String = """
{
"model": "qwen-turbo",
"temperature": $price,
"message": "Hello \"Agent\""
}
""".trimIndent() // .trimIndent() 用于自动去除前导空格
val jsonPrompt2: String = """
{
"model": "qwen-turbo",
"temperature": $price,
"message": "Hello \"Agent\""
}
"""// .trimIndent() 用于自动去除前导空格
println(jsonPrompt)
println(jsonPrompt2)
}
/**输出如下
{
"model": "qwen-turbo",
"temperature": 1.23,
"message": "Hello \"Agent\""
}
{
"model": "qwen-turbo",
"temperature": 1.23,
"message": "Hello \"Agent\""
}
*/
二、安全符
// 【空安全核心】:
// ?. 是安全调用符:如果 agent 整体或某个属性为 null,不报空指针异常(NPE),直接返回 null
// ?: 是 Elvis 操作符(绝对防御):如果左边算出来是 null,就采用右边的默认值
// 【Java】: agent.getModelName() != null ? agent.getModelName().toUpperCase() : "UNKNOWN"
// 【Python】: agent.modelName.upper() if agent.modelName is not None else "UNKNOWN
Kotlin
val nameInCaps = agent.modelName.uppercase() ?: "UNKNOWN"
三、When
相当于 java的switch-case
Kotlin
// 【when 表达式】: 功能极强的分支
// 【Java】: switch-case 的史诗级增强版(支持任意类型、支持表达式)
// 【Python】: Python 3.10 引入的 `match-case`
when {
agent.temperature < 0.5 -> println("$nameInCaps: 当前处于精准生成模式")
agent.temperature == 0.7 -> println("$nameInCaps: 当前处于标准平衡模式")
else -> println("$nameInCaps: 当前处于发散创造模式")
}
四、高阶函数与Lambda表达式
val aaa=bbb.filter{条件}.map{目标}。即 bbb满足条件时,将目标作为aaa的值。
下述中 it即表示bbb
Kotlin
// 6. 高阶函数与 Lambda 表达式 (数据清洗/采集高频使用)
// ==========================================
// 筛选出 temperature 小于 0.6 的智能体名字
// 【Java】: agents.stream().filter(a -> a.getTemperature() < 0.6).map(BotConfig::getModelName).collect(...)
// 【Python】: [a.modelName for a in agents if a.temperature < 0.6] (列表推导式)
val preciseMethodNames = agents
.filter { it.temperature < 0.6 } // `it` 是 Kotlin 中 Lambda 表达式只有一个参数时的默认别名
.map { it.modelName }