Token导航 LogoToken导航

Agent Skill · 研究检索

java-kotlin(Java kotlin 搜索)

用于辅助 Java 项目开发、面向对象设计、Spring 生态、Maven 或 Gradle 依赖和后端工程实践。它适合让 Agent 分析类结构、设计接口、整理服务分层、生成测试或检查常见代码坏味道。使用时需要结合项目已有架构、包结构和依赖版本,不应只按通用教程改代码;涉及数据库、事务、并发或框架配置时,应先确认运行环境和回归测试范围。

java-kotlin 是研究检索类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为需要联网;许可证为 MIT,第三方扫描已通过,按安装量在研究检索类的 73,675 个 Skill 里排第 51,954。

总安装 569周安装 23GitHub Stars 12下载 178核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
MIT

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:java-kotlin(Java kotlin 搜索)
来源仓库:https://github.com/miles990/claude-software-skills
仓库路径:skills/java-kotlin
安装命令:
npx skills add https://github.com/miles990/claude-software-skills --skill java-kotlin
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。不同来源提供的安装方式可能略有差异;本站展示可直接复制的安装命令,安装前请核对来源页面。

skills.shnpx skills
npx skills add https://github.com/miles990/claude-software-skills --skill java-kotlin

这个 Skill 是做什么的

研究检索类 Skill 主要解决「找资料、核对事实、把来源整理清楚」的问题,通常会让助手先检索再总结。

探索 Java 与 Kotlin 混合编程时的互操作实践。支持查找语法转换技巧和跨平台代码共享方案。适用于需要同时维护两种语言模块的项目场景。注意检查目标运行时对混合栈的支持情况。适用宿主包括 Codex、Claude、Cursor、Gemini CLI,接入前应确认版本、权限和运行环境要求。

java-kotlin 属于研究检索类 Skill,可作为该场景下的辅助能力补充。

来源仓库内路径:skills/java-kotlin

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/miles990/claude-software-skills --skill java-k…;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要需要联网,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

java-kotlin 怎么安装?

在终端执行 npx skills add https://github.com/miles990/claude-software-skills --skill java-kotlin。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

java-kotlin 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

java-kotlin 需要什么权限?

权限级别是需要联网。该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

java-kotlin 是免费的吗?

来源标注的许可证是 MIT。本站不代收任何费用,也不托管安装包;能否商用、要不要署名,以许可证原文为准。

java-kotlin 用的人多吗?

公开数据是累计安装 569 次,近一周安装 23 次,下载 178 次,GitHub 12 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

java-kotlin 安全吗?

第三方扫描结果为通过,但这只覆盖已知的静态检查项,不能替代自己读一遍源码和安装命令。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 3 个目录同时收录,说明这个 Skill 流传比较广。
  • 许可证明确为 MIT,商用和分发边界好判断。
  • 第三方扫描已通过,常见的高风险行为没有命中。

先想清楚的地方

  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理研究检索类任务、又不想每次都手写提示词的人。
  • 需要许可证清楚、并且有第三方扫描结果的团队项目。

不太适合

  • 需要厂商级技术支持和 SLA 的生产系统。

研究检索类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
find-skills

寻找技能 · Codex、Claude

31,199,81316,486操作浏览器MIT有提醒
self-improving-agent

自我改进 Agent · OpenClaw

16,464,0023,396接触敏感数据MIT-0通过
soultrace

灵魂追踪 · Codex、Claude

7,588,94412需要联网未明确有提醒
self-improving

自我完善 · OpenClaw

6,829,2841,046需要联网MIT-0通过
microsoft-foundry

微软代工厂 · Codex、Claude

6,614,144764调用外部服务未明确有提醒
java-kotlin

Java kotlin 搜索 · 本页

56912需要联网MIT通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Java & Kotlin

Overview

Modern Java and Kotlin patterns for JVM development.


Java Modern Features

Records and Sealed Classes (Java 17+)

// Record - immutable data class
public record User(
    String id,
    String email,
    String name,
    Instant createdAt
) {
    // Compact constructor for validation
    public User {
        Objects.requireNonNull(id);
        Objects.requireNonNull(email);
        if (!email.contains("@")) {
            throw new IllegalArgumentException("Invalid email");
        }
    }

    // Static factory method
    public static User create(String email, String name) {
        return new User(UUID.randomUUID().toString(), email, name, Instant.now());
    }
}

// Sealed classes - restricted hierarchy
public sealed interface Shape
    permits Circle, Rectangle, Triangle {
    double area();
}

public record Circle(double radius) implements Shape {
    @Override
    public double area() {
        return Math.PI * radius * radius;
    }
}

public record Rectangle(double width, double height) implements Shape {
    @Override
    public double area() {
        return width * height;
    }
}

public final class Triangle implements Shape {
    private final double base;
    private final double height;

    public Triangle(double base, double height) {
        this.base = base;
        this.height = height;
    }

    @Override
    public double area() {
        return 0.5 * base * height;
    }
}

Pattern Matching

// Pattern matching for instanceof (Java 16+)
public String describe(Object obj) {
    if (obj instanceof String s) {
        return "String of length " + s.length();
    } else if (obj instanceof Integer i) {
        return "Integer: " + i;
    } else if (obj instanceof List<?> list && !list.isEmpty()) {
        return "Non-empty list with " + list.size() + " elements";
    }
    return "Unknown type";
}

// Pattern matching for switch (Java 21+)
public double calculateArea(Shape shape) {
    return switch (shape) {
        case Circle c -> Math.PI * c.radius() * c.radius();
        case Rectangle r -> r.width() * r.height();
        case Triangle t -> 0.5 * t.base() * t.height();
    };
}

// Guard patterns
public String classify(Shape shape) {
    return switch (shape) {
        case Circle c when c.radius() > 10 -> "Large circle";
        case Circle c -> "Small circle";
        case Rectangle r when r.width() == r.height() -> "Square";
        case Rectangle r -> "Rectangle";
        default -> "Other shape";
    };
}

Streams and Optionals

import java.util.stream.*;
import java.util.Optional;

public class StreamExamples {
    // Basic operations
    public List<String> processUsers(List<User> users) {
        return users.stream()
            .filter(u -> u.active())
            .map(User::name)
            .sorted()
            .distinct()
            .collect(Collectors.toList());
    }

    // Grouping
    public Map<String, List<User>> groupByDomain(List<User> users) {
        return users.stream()
            .collect(Collectors.groupingBy(
                u -> u.email().substring(u.email().indexOf("@") + 1)
            ));
    }

    // Statistics
    public DoubleSummaryStatistics getStats(List<Order> orders) {
        return orders.stream()
            .mapToDouble(Order::total)
            .summaryStatistics();
    }

    // Parallel processing
    public long countLargeFiles(Path directory) throws IOException {
        try (Stream<Path> paths = Files.walk(directory)) {
            return paths
                .parallel()
                .filter(Files::isRegularFile)
                .filter(p -> {
                    try {
                        return Files.size(p) > 1_000_000;
                    } catch (IOException e) {
                        return false;
                    }
                })
                .count();
        }
    }

    // Optional handling
    public String getUserEmail(Long userId) {
        return findUser(userId)
            .map(User::email)
            .filter(email -> !email.isBlank())
            .orElse("unknown@example.com");
    }

    public User getOrCreate(Long userId) {
        return findUser(userId)
            .orElseGet(() -> createUser(userId));
    }
}

Kotlin Fundamentals

Data Classes and Null Safety

// Data class (like Java record)
data class User(
    val id: String = UUID.randomUUID().toString(),
    val email: String,
    val name: String,
    val createdAt: Instant = Instant.now()
) {
    init {
        require(email.contains("@")) { "Invalid email" }
    }
}

// Null safety
fun processUser(user: User?) {
    // Safe call
    val name = user?.name

    // Elvis operator
    val displayName = user?.name ?: "Anonymous"

    // Smart cast after null check
    if (user != null) {
        println(user.email) // user is User, not User?
    }

    // let for null-safe operations
    user?.let {
        sendEmail(it.email)
    }

    // Not-null assertion (use sparingly)
    val email = user!!.email // throws if null
}

// Platform types from Java
fun handleJavaString(javaString: String?) {
    // Treat Java strings as nullable
    val length = javaString?.length ?: 0
}

Extension Functions and Properties

// Extension function
fun String.toSlug(): String =
    this.lowercase()
        .replace(Regex("[^a-z0-9]+"), "-")
        .trim('-')

// Extension property
val String.wordCount: Int
    get() = this.split(Regex("\\s+")).size

// Extension on nullable type
fun String?.orEmpty(): String = this ?: ""

// Usage
val slug = "Hello World".toSlug() // "hello-world"
val count = "Hello World".wordCount // 2

// Scope functions
data class Config(var host: String = "", var port: Int = 0)

val config = Config().apply {
    host = "localhost"
    port = 8080
}

val result = user.let { it.name.uppercase() }

val processedUser = user.also { log.info("Processing ${it.id}") }

val transformed = with(user) {
    "$name <$email>"
}

Coroutines

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

// Suspend function
suspend fun fetchUser(id: String): User {
    return withContext(Dispatchers.IO) {
        api.getUser(id)
    }
}

// Concurrent execution
suspend fun fetchAllUsers(ids: List<String>): List<User> = coroutineScope {
    ids.map { id ->
        async { fetchUser(id) }
    }.awaitAll()
}

// Structured concurrency
suspend fun processOrders(orders: List<Order>) = coroutineScope {
    orders.forEach { order ->
        launch {
            processOrder(order)
        }
    }
}

// Exception handling
suspend fun safeFetch(id: String): Result<User> = runCatching {
    fetchUser(id)
}

// Flow (cold stream)
fun fetchUsers(): Flow<User> = flow {
    val users = api.getAllUsers()
    users.forEach { user ->
        emit(user)
        delay(100)
    }
}

// Flow operators
suspend fun processUserFlow() {
    fetchUsers()
        .filter { it.active }
        .map { it.name }
        .catch { e -> emit("Error: ${e.message}") }
        .collect { name ->
            println(name)
        }
}

// StateFlow for state management
class UserViewModel : ViewModel() {
    private val _state = MutableStateFlow<UiState>(UiState.Loading)
    val state: StateFlow<UiState> = _state.asStateFlow()

    fun loadUser(id: String) {
        viewModelScope.launch {
            _state.value = UiState.Loading
            try {
                val user = fetchUser(id)
                _state.value = UiState.Success(user)
            } catch (e: Exception) {
                _state.value = UiState.Error(e.message ?: "Unknown error")
            }
        }
    }
}

Sealed Classes and When

// Sealed class hierarchy
sealed class Result<out T> {
    data class Success<T>(val data: T) : Result<T>()
    data class Error(val message: String, val cause: Throwable? = null) : Result<Nothing>()
    object Loading : Result<Nothing>()
}

// Exhaustive when
fun <T> handleResult(result: Result<T>): String = when (result) {
    is Result.Success -> "Success: ${result.data}"
    is Result.Error -> "Error: ${result.message}"
    Result.Loading -> "Loading..."
}

// Sealed interface
sealed interface UiEvent {
    data class ShowMessage(val message: String) : UiEvent
    data class Navigate(val route: String) : UiEvent
    object GoBack : UiEvent
}

// When with guards
fun describe(value: Any): String = when {
    value is String && value.isEmpty() -> "Empty string"
    value is String -> "String: $value"
    value is Int && value > 0 -> "Positive int"
    value is Int -> "Non-positive int"
    else -> "Unknown"
}

Functional Patterns

// Higher-order functions
inline fun <T> List<T>.customFilter(predicate: (T) -> Boolean): List<T> {
    val result = mutableListOf<T>()
    for (item in this) {
        if (predicate(item)) {
            result.add(item)
        }
    }
    return result
}

// Function composition
infix fun <A, B, C> ((B) -> C).compose(other: (A) -> B): (A) -> C = { a ->
    this(other(a))
}

val double: (Int) -> Int = { it * 2 }
val addOne: (Int) -> Int = { it + 1 }
val doubleThenAddOne = addOne compose double
println(doubleThenAddOne(3)) // 7

// Currying
fun add(a: Int): (Int) -> Int = { b -> a + b }
val add5 = add(5)
println(add5(3)) // 8

// Memoization
fun <T, R> ((T) -> R).memoize(): (T) -> R {
    val cache = mutableMapOf<T, R>()
    return { key ->
        cache.getOrPut(key) { this(key) }
    }
}

val fibonacci: (Int) -> Long = { n: Int ->
    if (n <= 1) n.toLong()
    else fibonacci(n - 1) + fibonacci(n - 2)
}.memoize()

DSL Building

// Type-safe builder DSL
class HtmlBuilder {
    private val children = mutableListOf<String>()

    fun head(block: HeadBuilder.() -> Unit) {
        children.add(HeadBuilder().apply(block).build())
    }

    fun body(block: BodyBuilder.() -> Unit) {
        children.add(BodyBuilder().apply(block).build())
    }

    fun build() = "<html>${children.joinToString("")}</html>"
}

class BodyBuilder {
    private val children = mutableListOf<String>()

    fun div(classes: String = "", block: BodyBuilder.() -> Unit = {}) {
        children.add("<div class=\"$classes\">${BodyBuilder().apply(block).build()}</div>")
    }

    fun p(text: String) {
        children.add("<p>$text</p>")
    }

    fun build() = children.joinToString("")
}

fun html(block: HtmlBuilder.() -> Unit) = HtmlBuilder().apply(block).build()

// Usage
val page = html {
    body {
        div("container") {
            p("Hello, World!")
        }
    }
}

// Test DSL
class TestContext {
    fun given(description: String, block: () -> Unit) {
        println("Given: $description")
        block()
    }

    fun whenever(description: String, block: () -> Unit) {
        println("When: $description")
        block()
    }

    fun then(description: String, block: () -> Unit) {
        println("Then: $description")
        block()
    }
}

fun test(name: String, block: TestContext.() -> Unit) {
    println("Test: $name")
    TestContext().apply(block)
}

// Usage
test("user registration") {
    given("a new user email") { }
    whenever("registering the user") { }
    then("user should be created") { }
}

Related Skills

  • [[backend]] - Spring Boot development
  • [[mobile]] - Android development
  • [[testing]] - JUnit, Kotest

平台分布

OpenCode

27.7%
按下载量换算49

Gemini CLI

23.99%
按下载量换算43

Antigravity

17.52%
按下载量换算31

Claude Code

12.93%
按下载量换算23

windsurf

8.07%
按下载量换算14

Codex

3.17%
按下载量换算6

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。

继续浏览同类 Skills