Kotlin--1-基础语法

整体

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 }