阅读视图

发现新文章,点击刷新页面。
🔲 ⭐

OpenClaw Workspace 完全指南——打造你的专属 AI 编程助手

最近伯衡君在研究如何更好地使用 OpenClaw 这个多渠道 AI 智能体 Gateway 网关,发现它的 Workspace(工作区)功能非常强大。作为一名程序员,伯衡君最看重的是 OpenClaw 强大的编程辅助能力——它可以帮助你写代码、调试程序、管理项目。通过合理配置工作区,你可以让 AI 拥有"记忆",理解你的代码风格和编程偏好,成为真正的专属编程助手。今天伯衡君就把这份完整的工作区配置指南分享给大家……
🔲 ☆

Kotlin与Java对照手册

1. 基本类型

类型Kotlin 写法Java 写法简要说明
数字Int, Long, Float, Double, Short, Byteint, long, float, double, short, byteKotlin 数值类型映射到相应的原生/包装类型。
布尔Booleanboolean只能取 true/false,与数字不互通。
字符Charchar单个 Unicode 字符,支持转义序列。
字符串StringString不可变;支持多行文本块 """..."""
数组Array<T>, IntArrayT[]提供原始类型专用数组如 IntArrayByteArray
无符号整型UInt, ULong, UShort, UByte编译时检查范围,运行时越界抛 IllegalArgumentException

2. 语法对照

功能Java 写法Kotlin 写法简要说明
变量定义int x = 10; final String name = "Tom";var x = 10 val name = "Tom"var 可变,val 只读;类型由编译器推断。
类 + 构造public class P { P(String n) { ... } }class P(val name: String)主构造中声明属性,自动生成字段 & 访问器。
数据类手动写字段/构造/equals/toStringdata class User(val id: Int, val n: String)data 自动生成常用方法 & 解构组件。
函数定义public int sum(int a, int b) { return a + b; }fun sum(a: Int, b: Int) = a + b表达式函数可省略大括号和 return
空安全if (s != null) len = s.length(); else len = 0;val len = s?.length ?: 0String? 可空,?.?: 插入编译期空检查。
分支匹配switch(x) { case 1: ... }when(x) { 1 -> ...; else -> ... }when 是表达式,支持范围 & 任意对象比较。
循环 & 集合for(int i=0;i<10;i++)``list.stream().filter()for(i in 0 until 10)``list.filter{}0 until 生成 IntRange;集合链式调用基于扩展函数。
单例class S { private static S i=new S(); … }object S { fun foo() {} }object 编译时生成线程安全单例,无需额外样板。

3. 独有亮点

特性示例简要说明
默认 & 命名参数fun g(msg: String = "Hi", name: String = "You") g(name="Tom")编译器生成默认方法,命名参数避免重载歧义。
扩展函数fun String.ex() = uppercase()编译后为静态方法,第一个参数是接收者,调用如成员方法。
解构声明val (x, y) = Point(1, 2)data class 自动生成 componentN(),一行取多值。
密封类sealed class R; data class Ok(val d: String): R(); object Err: R()限定子类范围,when 可做穷尽检查。
内联函数inline fun <T> m(b: ()->T): T { … }在调用处展开函数体,减少高阶函数的运行时开销。
集合构造器listOf(1, 2), mutableListOf("A"), mapOf("a" to 1)内建集合工厂函数,语法简洁;to 表示键值对。
数组构造器arrayOf(1, 2), intArrayOf(1, 2)支持泛型与原始类型数组,避免装箱。
表达式返回值val max = if (a > b) a else b val result = try { … } catch { … }ifwhentry 都是表达式,可直接赋值。
区间语法 & 步进for (i in 1..5), for (j in 1 until 5 step 2).. 表闭区间,until 表半开,step 控制步长。
字符串模板"Hello, $name" "Length: ${s.length}"$变量 可直接拼接,复杂表达式用 ${}
Lambda 尾随语法list.filter { it > 0 }.map { it * 2 }大括号可直接跟随函数调用,链式语法自然、简洁。

4. 常用标准库函数

函数用法示例简要说明
letuser?.let { print(it.name) }非空时执行块,it 引用原对象。
applyUser().apply { age = 18 }在对象上执行块并返回该对象,常用于初始化。
alsolist.also { println("init") }执行副作用并返回对象,常用于日志 / 调试。
runval r = run { compute(); result }无接收者的作用域块,返回最后一行结果。
withwith(cfg) { load(); validate() }对象上下文块,this 指向接收者,返回结果。
takeIfstr.takeIf { it.isNotBlank() }条件为真返回对象,否则返回 null
sequencesequenceOf(1,2,3).map { … }惰性集合处理,适合大规模数据管道。

5. 类型系统对比

功能Java 写法Kotlin 写法简要说明
泛型List<String>List<String>支持协变 / 逆变(out / in)和 reified 泛型函数。
类型别名typealias Name = String简化复杂类型声明。
枚举类enum Color { RED, GREEN }enum class Color { RED, GREEN }支持在枚举中定义属性 & 方法。
内联类@JvmInline value class USD(val amount: Int)编译时包装或展开,零开销封装。

6. 类型检测与转换

功能Java 写法Kotlin 写法简要说明
类型检查if (obj instanceof String)if (obj is String)is 后自动智能转换,无需显式强转。
安全转换(String) objobj as String / obj as? Stringas? 安全转换失败返回 null
基本转换Integer.parseInt(str)str.toInt(), toDouble(), toLong()通过扩展函数提供常见类型转换。

7. 控制流程 & 异常

功能Java 写法Kotlin 写法简要说明
条件 & 循环if, switch, for, while, do-whileif, when, for, while, do-whilewhen 可做表达式,替代 switch
返回 & 跳转return, break, continue, throw同 Java支持在 lambda 中局部返回,如 return@label
异常处理try-catch-finally, checked exceptiontry-catch-finally,无 checked exceptionKotlin 不区分受检异常,简化错误处理。

8. 包与导入

功能Java 写法Kotlin 写法简要说明
包声明package com.example;package com.example不需要分号。
导入import java.util.List;import java.util.List支持导入顶层函数和属性。
别名导入import foo.Bar as Baz解决命名冲突或简化引用。

9. 面向对象相关

功能Java 写法Kotlin 写法简要说明
接口默认实现default void f() {}接口中可直接写方法体接口内方法可有实现,无需关键字。
抽象类abstract class Shape { … }abstract class Shape { … }抽象成员不需再加 abstract 前缀。
继承 & 覆写class A extends B { @Override … }class A : B() { override fun … }: 表示继承,override 必显式标注。
可见性修饰符public/protected/privatepublic/protected/private/internalinternal 表示同模块内可见。
内部类class Outer { class Inner {} }class Outer { inner class Inner {} }默认是静态嵌套,加 inner 变为非静态内部类。

10. 协程 vs 多线程

场景Java 写法(线程/异步)Kotlin 写法(协程)简要说明
启动任务new Thread(() -> work()).start();GlobalScope.launch { work() }协程更轻量、省资源,适合大规模并发。
异步返回值Future<Integer> f = exec.submit(...);val result = async { compute() }.await()内建 async/await,语义更清晰。
延迟执行Thread.sleep(1000)delay(1000)非阻塞挂起,不占用线程。
结构化并发手动管理线程池和生命周期coroutineScope { … }协程作用域自动管理生命周期,避免泄漏。

📦 11. 集合操作对比

功能Java 写法(Stream)Kotlin 写法(扩展函数)简要说明
过滤list.stream().filter(x -> x > 0).collect(...)list.filter { it > 0 }语法简洁,链式调用更直观。
映射list.stream().map(x -> x * 2).collect(...)list.map { it * 2 }Lambda 简洁,扩展函数无额外依赖。
分组Collectors.groupingBy(...)list.groupBy { it.key }直接返回 Map<K, List<V>>,更易读。
排序list.sort(Comparator.comparing(...))list.sortedBy { it.prop }函数式排序,链式可读性好。
聚合reduce, sum, collectreduce, sumOf, fold内建多种聚合函数,常用时无需额外导入。

参考:

Kotlin内核编程
Kotlin 语言参考文档
深入理解Kotlin协程
有没有 Kotlin 讲协程比较好的书籍或博客连载
Kotlin 官方文档 中文版

🔲 ⭐

LeetCode: Make a Square with the Same Color

Problem

source: 3127. Make a Square with the Same Color

difficulty: easy

You are given a 2D matrix grid of size 3 x 3 consisting only of characters 'B' and 'W'. Character 'W' represents the white color, and character 'B' represents the black color.

Your task is to change the color of at most one cell so that the matrix has a 2 x 2 square where all cells are of the same color.

Return true if it is possible to create a 2 x 2 square of the same color, otherwise, return false.

Constraints:

  • grid.length == 3
  • ``grid[i].length == 3`
  • grid[i][j] is either 'W' or 'B'.

Solution

问题可以转化成判断 matrix 是否存在一个 2 * 2 的 matrix,其中包含 3 or 4 个相同的元素。

但是再仔细一看 matrix 只有 3 * 3,因此可以直接分成 4 个 block,分别判断 4 个 block 是否存在就行了。

Kotlin

直接判断每一个点分别在哪些 block 里面,但是这几个 if 判断就写得很丑陋(写了一个之后干脆打开 GitHub Copilot 生成算了)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
class Solution {
 fun canMakeSquare(grid: Array<CharArray>): Boolean {
 val cnt = IntArray(4)
 fun Char.value(): Int = if (this == 'B') 1 else -1

 for (i in 0..2) {
 for (j in 0..2) {
 if ( i < 2 && j < 2) cnt[0] += grid[i][j].value()
 if ( i < 2 && j > 0) cnt[1] += grid[i][j].value()
 if ( i > 0 && j < 2) cnt[2] += grid[i][j].value()
 if ( i > 0 && j > 0) cnt[3] += grid[i][j].value()
 }
 }

 return cnt.any() { it in listOf(2, -2, 4, -4) }
 }
}

Scala

最近在学 Scala,于是自然又用 Scala 写一次。相比于此前丑陋的 if 判断,干脆写得更加函数式,试一下 loop free。

直接三行搞定。

1
2
3
4
5
6
7
8
9
object Solution {
 def canMakeSquare(grid: Array[Array[Char]]): Boolean = {
 def getRange = for { i <- 0 to 1; j <- 0 to 1} yield (i, j)

 def check(x: Int, y: Int): Boolean = getRange.count((i, j) => grid(x + i)(y + j) == 'B') != 2

 getRange.count((i, j) => check(i, j)) >= 1
 }
}
❌