Java 如何改为Kotlin(一)

Kotlin编程语言(一)——Java到kotlin的演变过程 Kotlin 是一种现代的静态类型编程语言,由 JetBrains 公司于 2011 年首次发布。Kotlin 设计的目标是提高开发效率和代码质量,同时保持与 Java 的高度互操作性。Kotlin 可以在 JVM(Java 虚拟机)上运行,也可以编译成 JavaScript 或原生代码(通过 LLVM 编译器),适用于多种平台和应用场景。Java 到 Kotlin 的演变过程是一个逐步发展的过程,涉及到多个方面的改进和创新。 阅读详情

重构为Kotlin

准备User类

public class User {

    private String firstName;
    private String lastName;

    public User(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

}

Java文件转换为Kotlin文件

选择XXX.java 文件,右键选择并将其转换为 Kotlin:Code -> Convert Java File to Kotlin File

声明可空性、val、var 和数据类

var 修饰可变变量

val 修饰不可变变量。val 类似于 Java 中的 final 关键字

Kotlin 文件的扩展名为 .kt

Kotlin 与 Java的一个区别在于:Kotlin 会明确指定变量能否接受 null 值。具体而言,其是通过在类型声明后附加"?"以进行此项指定

数据类

关键字 :data

data class User(var firstName: String?, var lastName: String?)

在将此类标记为 data 类后,编译器便会自动创建 getter 和 setter。此外,其还会派生 equals()、hashCode() 和 toString() 函数

data 类必须至少有一个主构造参数

多构造参数,例如:

data class User(var firstName: String, var lastName: String) {
    constructor(firstName: String) : this(firstName,"Tom") {}
}

您可在官方文档中阅读有关构造函数的更多内容

相等性

Kotlin 分为两类相等性:

  • 构成相等使用 == 运算符,并调用 equals() 来确定两个实例是否相等。
  • 引用相等使用 === 运算符,以检查两个引用是否指向同一对象
val user1 = User("Jane", "Doe")
val user2 = User("Jane", "Doe")
val structurallyEqual = user1 == user2 // true
val referentiallyEqual = user1 === user2 // false

您可在官方文档中阅读有关数据类的更多内容。

默认参数与命名参数

data class User(var firstName: String?, var lastName: String? = null)

// usage
val jane = User ("Jane") // same as User("Jane", null)
val joe = User ("John", "Doe")

默认参数 lastName 的默认值为 null,也可以这样写

val john = User (firstName = "John", lastName = "Doe") 

假如 firstName 将 null 用作其默认值,而 lastName 并不如此。在此情况下,由于默认参数位于未设默认值的参数之前,因此您必须使用命名参数来调用此函数,具体如下:

data class User(var firstName: String? = null, var lastName: String?)

// usage
val jane = User (lastName = "Doe") // same as User(null, "Doe")
val john = User ("John", "Doe")

若您的函数具有多个参数,请考虑使用命名参数

对象初始化、伴生对象和单一实例

public class Repository {
    private static Repository INSTANCE = null;
    private List<User> users = null;


    public static Repository getInstance() {
        if (INSTANCE == null) {
            synchronized (Repository.class) {
                if (INSTANCE == null) {
                    INSTANCE = new Repository();
                }
            }
        }
        return INSTANCE;
    }

    public Repository() {
        User user1 = new User("Jane", "");
        User user2 = new User("Jane", null);
        User user3 = new User("Jane", "Doe");
        users = new ArrayList<>();

        users.add(user1);
        users.add(user2);
        users.add(user3);

    }

    public List<User> getUsers() {
        return users;
    }

    public List<String> getFormattedUserName() {
        List<String> userNames = new ArrayList<>(users.size());
        for (User user :
                users) {
            String name;
            if (user.getLastName() != null) {
                if (user.getFirstName() != null) {
                    name = user.getFirstName() + " " + user.getLastName();
                } else {
                    name = user.getLastName();
                }
            } else if (user.getFirstName() != null) {
                name = user.getFirstName();
            } else {
                name = "Unknown";
            }
            userNames.add(name);
        }
        return userNames;
    }
}

把Repository 类转换为 Kotlin

class Repository {
    private var users: MutableList<User>? = null
    fun getUsers(): List<User>? {
        return users
    }

    val formattedUserName: List<String?>
        get() {
            val userNames: MutableList<String?> =
                ArrayList(users!!.size)
            for ((firstName, lastName) in users!!) {
                var name: String
                name = if (lastName != null) {
                    if (firstName != null) {
                        firstName + " " + lastName
                    } else {
                        lastName
                    }
                } else if (firstName != null) {
                    firstName
                } else {
                    "Unknown"
                }
                userNames.add(name)
            }
            return userNames
        }

    companion object {
        private var INSTANCE: Repository? = null
        val instance: Repository?
            get() {
                if (INSTANCE == null) {
                    synchronized(Repository::class.java) {
                        if (INSTANCE == null) {
                            INSTANCE = Repository()
                        }
                    }
                }
                return INSTANCE
            }
    }

    init {
        val user1 = User("Jane", "")
        val user2 = User("Jane", null)
        val user3 = User("Jane", "Doe")
        users = ArrayList()
        users!!.add(user1)
        users!!.add(user2)
        users!!.add(user3)
    }
}

我们来看一下自动转换器执行了哪些操作:

  • 添加了 init 代码块

  • static 字段现已加入 companion object 代码块中

  • users 列表可为 null,因为该对象在声明时并未实例化

  • getFormattedUserNames() 方法现已成为一个属性

  • 在对用户列表执行循环时,其语法与 Java 不同

    等效规则:

    KotlinJava
    init块构造函数
    companion object静态属性和静态方法 (static)

init块

在 Kotlin 中,主构造函数无法包含任何代码,因此初始化代码会置于 init 块中

class Repository private constructor() {
    ...
    init {

        val user1 = User("Jane", "")
        val user2 = User("John", null)
        val user3 = User("Anne", "Doe")

        users = ArrayList()
        users!!.add(user1)
        users.add(user2)
        users.add(user3)
    }

}

init 代码大都用于处理属性的初始化。这项操作也可在声明属性时完成。例如,在 Kotlin 版本的 Repository 类中,我们可以看到,users 属性已在声明时进行初始化

private val users: MutableList<User>? = null

您可在官方文档中阅读有关初始化程序块的更多内容

Kotlin 的"静态"属性与"静态"方法

在 Java 中,我们会在字段或函数中使用 static 关键字,以指出此等字段或函数属于某个类,但不属于该类的某个实例。因此,我们在 Repository 类中创建了 INSTANCE 静态字段。在 Kotlin 中,companion object 代码块与此等效。您还可在此处声明静态字段和静态函数。转换器已创建 INSTANCE 字段并将其移至此处

处理单一实例

由于只需要Repository 类的一个实例,因此我们在 Java 中使用了单一实例模式

在 Kotlin 中,通过将 class 关键字替换为 object,可以在编译器级别强制使用此模式

现在,我们可以移除私有构造函数和伴生对象(companion object)

object Repository {
    private var users: MutableList<User>? = null
     fun getUsers(): List<User>? {
        return users
    }

    val formattedUserName: List<String?>
        get() {
            val userNames: MutableList<String?> =
                ArrayList(users!!.size)
            for ((firstName, lastName) in users!!) {
                var name: String?
                name = if (lastName != null) {
                    if (firstName != null) {
                        firstName + " " + lastName
                    } else {
                        lastName
                    }
                } else if (firstName != null) {
                    firstName
                } else {
                    "Unknown"
                }
                userNames.add(name)
            }
            return userNames
        }



    init {
        val user1 = User("Jane", "")
        val user2 = User("Jane", null)
        val user3 = User("Jane", "Doe")
        users = ArrayList()
        users!!.add(user1)
        users!!.add(user2)
        users!!.add(user3)
    }
}

使用 object 类时,我们直接在对象上调用函数和属性,如下所示:

val users = Repository.getUsers()

您可在官方文档中阅读有关对象和伴生对象的更多内容

解构

Kotlin 允许使用名为解构声明的语法,将对象解构为多个变量。我们可以创建多个变量,并能独立使用这些变量

例如,数据类支持解构,因此自动转换器能够将 for 循环中的 User 对象解构。如此一来,我们便可直接处理 firstName 和 lastName 值,具体如下:

for ((firstName, lastName) in users) {
       val name: String?

       if (lastName != null) {
          if (firstName != null) {
                name = "$firstName $lastName"
          } 
       ...

您可在官方文档中阅读有关解构声明的更多内容

处理可空性

将 Repository 类转换为 Kotlin 时,自动转换器已将用户列表设为可为 null,这是由于我们在声明时并未将其初始化为对象。在 users 对象的所有使用情境中,我们都使用了非 null 断言运算符 !!。该运算符可将所有变量转换为非 null 类型,并在值为 null 时抛出异常。使用 !! 时,存在运行时抛出异常的风险

建议您使用下列其中一种方法来处理可空性:

  • 执行 null 检查 (if (users != null) {...})
  • 使用 Elvis 运算符 ?:
  • 使用某些 Kotlin 标准函数

您可在官方文档中阅读有关空安全的更多内容

创建集合类实例时,您可以利用 Kotlin 所提供的多个帮助程序函数,让代码更易阅读而且更为灵活。本例中,我们将 MutableList 用于 users,具体如下:

private val users: MutableList<User>? = null

为简单起见,我们可以使用 mutableListOf() 函数,提供列表元素类型,从 init 代码块中移除 ArrayList 构造函数调用,然后移除 users 属性的显式类型声明,具体如下:

private val users = mutableListOf<User>()

作出此项更改后,users 属性现已变为非 null,我们此时亦可移除所有不必要的 !! 运算符实例

运算符:

!! 非 null 断言运算符 ,该运算符可将所有变量转换为非 null 类型,并在值为 null 时抛出异常。使用 !! 时,存在运行时抛出异常的风险

?: Elvis 运算符 若左侧表达式不为 null,则 Elvis 运算符将返回该表达式,否则便会返回右侧表达式

若 user.firstName 不为 null,以下代码便会返回此值。若 user.firstName 为 null,该表达式将返回右侧值 "Unknown",具体如下:

if (lastName != null) {
    ...
} else {
    name = firstName ?: "Unknown"
}

您可在官方文档中阅读有关 Elvis 运算符的更多内容

字符串模板和 if 表达式

借助字符串模板,Kotlin 将能简化 String 的处理工作。字符串模板允许在字符串声明内引用变量

使用 $ 符号直接在字符串内引用变量名称,并可将表达式置于 { } 之间

// Java
name = user.getFirstName() + " " + user.getLastName();

// Kotlin
name = "${user.firstName} ${user.lastName}"

在 Kotlin 中,if、when、for 和 while 均为表达式,它们有返回值。

我们将if 语句的最后一行将被用于赋值。如下所示,我们可以更清晰地看到,此代码块的唯一目的便是初始化 name 值:

name = if (firstName != null) {   // do something   
firstName  
}
// name = firstName 

从 if 语句中移出赋值的做法很容易遭到滥用。请确保您的 if 代码块仅具有一个角色,且不会产生其他附带后果

接下来,页面会弹出警告,提示我们可以将 name 声明与赋值合并。同样,我们继续遵照该警告进行操作。由于可以推导出名称变量的类型,因此我们可以移除显式类型声明。现在,formattedUserNames 将如下所示:

val formattedUserNames: List<String>
        get() {
            val userNames = ArrayList<String>(users.size)
            for ((firstName, lastName) in users) {
                val name = if (lastName != null) {
                    if (firstName != null) {
                        "$firstName $lastName"
                    } else {
                        lastName ?: "Unknown"
                    }
                } else {
                    firstName ?: "Unknown"
                }

                userNames.add(name)
            }
            return userNames
        }

您可在官方文档中阅读有关 if、when、for 和 while 的更多内容

kotlin-jps-plugin.jar 立即下载

相关推荐

WRF后处理避坑指南:从namelist配置到降水计算的全流程解析

本文提供了一份详尽的WRF模式后处理避坑指南,涵盖从理解wrfout文件结构、核心变量解析到累计降水计算与专业气象图绘制的全流程。重点解析了RAINC与RAINNC的正确处理方法,并分享了使用wrf-python库高效绘制位势高度叠加风场图、累计降水图等专业图表的实战技巧与代码,旨在帮助用户规避常见错误,提升后处理效率与图表质量。

weixin_29200485的博客 362

【Kotlin】从Java转向Kotlin,耐心看完这篇博客就够了。Kotlin快速入门教程分享

Kotlin、Any、Unit、Nothing、泛型、型变、约束、方法、顶级方法、vararg、infix、扩展方法、伴生对象、单例模式、init、inner、sealed、data class、委托、by、枚举、密封类和枚举对比、常用方法、实例域、操作符重载、文件、读写、元注解、位置注解、反射、ORM框架、Class、KClass、函数类型、Lambda表达式、高阶函数、内联函数、inline、noinline、crossinline、reified、this、协程、非阻塞式、suspend

ZDG-Kinlon 5981

技术面试官视角:复盘北航/中科院/哈工大保研机试与面试,他们到底在考察什么?(附真题回忆与评分侧重点)

本文从技术面试官视角解析北航、中科院、哈工大等顶尖院校保研机试与面试的考核逻辑,揭示编程语言限制、题目难度设计等隐藏考察维度,并提供真题回忆与评分侧重点。帮助考生理解面试官的真实意图,掌握应对策略,提升通过率。

weixin_42549496的博客 518

Android实战基础 - Java、Kotlin 代码互转

在Android现阶段,Kotlin已经成为普遍性使用的语言,而在其使用阶段中Java和Kotlin的混用很常见,为了便于开发,我们需要掌握Java、Kotlin文件的转换 这应该是我以前刚学Kotlin时就想记录的一篇blog,没想到隔了这么久才进行记录(嗯… 主要这俩年好像有点忙…)

Android、前端、小程序、后端 1万+

避坑指南:CesiumLab+ENVI处理Sentinel-2影像数据的完整流程

本文提供了一份详细的避坑指南,完整介绍了如何利用CesiumLab和ENVI工具链,将Sentinel-2卫星影像处理成可供Cesium三维地球引擎加载的离线瓦片数据。内容涵盖数据获取、SNAP预处理、ENVI影像增强合成以及CesiumLab切片配置等全流程实战步骤与关键参数优化,旨在帮助工程师高效构建自主可控的高精度离线地图服务。

weixin_29248653的博客 291

Qwen2.5-Omni实战:5分钟搞定多模态AI模型本地部署(含Thinker-Talker架构解析)

本文详细介绍了Qwen2.5-Omni多模态AI模型的本地部署流程,包括硬件配置、环境准备和实战应用开发。特别解析了其创新的Thinker-Talker架构,该架构通过TMRoPE位置编码实现跨模态同步处理,大幅提升多模态任务效率。5分钟即可完成部署,适合开发者快速实现文本、图像和音频的联合处理。

weixin_29085865的博客 172

Java转Kotlin指北

Java到Kotlin指北前言变量声明为什么要有var和val?类型函数参数默认值逻辑控制if语句when语句循环语句for-in 循环与区间两端闭区间左闭右开区间降序区间规律跳过一些元素repeat 循环类与对象实例化继承类构造函数主构造函数次构造函数接口接口方法默认实现函数可见性修饰符数据类单例类字符串内嵌表达式 前言 Java实际上是一种解释性语言. Java源代码编译后, 生成能被JVM执行的class文件. Kotlin编译器生成的文件能被JVM识别并执行, 所以即使KT的语法和Java相差甚远

Reven_L的博客 1634

基于BenchmarkSQL的达梦数据库TPCC性能测试

中的用户和密码在达梦数据库中创建测试用户,并保证其表空间足够容纳生成的测试数据。如果开启了归档,还要考虑归档日志占用的空间。BenchmarkSQL默认不支持达梦数据库。这里我们让BenchmarkSQL把达梦数据库当作Oracle即可。Oracle数据库对应的测试配置文件为。是使用BenchmarkSQL进行性能测试的主要配置文件。是生成的测试报告,png文件是报告中包含的图片。拷贝达梦数据库驱动到BenchmarkSQL的。测试结束后,会在当前路径下生成一个以。规则命名的结果目录。

Sebastien23的博客 2635

Java 转 Kotlin 指南

给Java开发者速查的Kotlin指南。

wwtg9988的博客 2093

AI挖矿技术全景解析:从智能勘探到自主开采的2025年度技术演进与产业变革

随着全球关键矿产资源需求激增与开采难度加剧,人工智能(AI)技术正在重塑矿业全生命周期。本文系统综述了2025年AI挖矿技术的最新进展,涵盖从地质勘探、资源评估到自主开采、安全监控的完整技术链条。基于Elsevier 2025年发表的最新研究成果及IEEE会议前沿动态,本文深入分析了深度学习、强化学习、计算机视觉等核心技术在矿物识别、品位预测、设备维护等场景的应用机制。研究数据显示,AI技术已使勘探成功率提升45%,设备停机时间减少35%,整体运营效率提高40%以上。

nmdbbzcl的博客 2084

【LangChain编程:从入门到实践】实现多模态代理

【LangChain编程:从入门到实践】实现多模态代理 关键词:LangChain, 多模态代理, 自然语言处理, 机器学习, 知识图谱, 对话系统, 代码生成, AI代理 1. 背景介绍 随着人工智

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 581

kotlin和java相互转换的实操

android studio中进行java和kotlin代码互相转换

小东的博客 2万+

【51单片机仿真】基于51单片机设计的多功能电子时钟日历(实时时钟闹钟秒表温度检测)系统__资料编号5

该项目是基于单片机的多功能电子时钟系统,集成了时间显示、闹钟设置、秒表功能以及温度显示等功能。主要硬件包括1602液晶显示屏、DS1302时钟芯片、DS18B20温度传感器和蜂鸣器。系统通过按键进行时间和闹钟的设置,并实时显示当前时间和温度。

嵌入式阿齐Archie 2万+

为什么使用kotlin开发和一键将java改为kotlin(一)

1、kotlin的由来 2017年5月,谷歌官网将kotlin定义为Android开发官方语言,kotlin以其简洁性、和不为空的特性而被大家欢迎。 2、在我理解中kotlin毕竟是一门语言,所以如果学习的话还是的花一些时间的,但我感觉比较方便的是可以将java直接翻译成kotlin开发方式,有不会写的直接写成java再翻译成kotlin,要容易学很多。 2、为什么学习kotlin    ...

会飞的鱼儿的博客 3135

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

android解决kotlin问题Expecting member declaration

示例代码 android kotlin工程 class MainActivity : AppCompatActivity() { private SerialPort mSerialPort = null; // 这一行会出错 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activi

zmlovelx(帅得不敢出门 程序员群31843264) 6603

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【Kotlin】Kotlin 与 Java 互操作 ① ( 变量可空性 | Kotlin 类型映射 | Kotlin 访问私有属性 | Java 调用 Kotlin 函数 )

一、Kotlin 变量可空性 1、Java 与 Kotlin 空值处理区别 2、Java 函数返回非空值和控制 3、Kotlin 函数调用 Java 函数 4、平台类型 5、@NotNull 和 @Nullable 注解 二、Kotlin 的 Java 类型映射 三、Kotlin 访问 Java 私有属性 四、Java 调用 Kotlin 函数 1、函数调用 2、分析 Kotlin 代码生成的字节码数据 3、使用 @JvmName 注解修改 Kotlin 生成的 Java 类名

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Kotlin与Java的异同(一)

Kotlin简介 Kotlin是一种针对Java 平台的新编程语言。Kotlin简洁、安全、务实,并且专注于与Java代码的互操作性。它几乎可以用在现在Java使用的任何地方:服务端开发、Android应用等等。Kotlin 可以很好地和所有现存的Java库和框架一起工作,而且性能和Java旗鼓相当。 Kotlin 特点: Kotlin 是静态类型语言并支持类型推导,允许维护正确性与性能的同时保...

wangjiang 3万+

秒懂Kotlin之Java程序员如何快速掌握Kotlin

Kotlin/JVM 可以看做是对改进Java的一种积极的尝试,其试图改进Java的已知的被广泛讨论的缺点。 关于Kotlin与Java的爱恨情仇此处按下不表,等有机会单独写一篇相关文章。此文仅从Java惯用者的角度给出使用Kotlin的一些建议,这往往是Java惯用者迅速掌握Kotlin至关重要的方面。 本文主要着眼于Kotlin与Java在语法上差异,便于Java惯用者快速上手Kotlin。 基于Kotlin 1.4.0 版本 通用差异 Kotlin中的方法和属性可以不存在于类中 我们知道,Jav

ShuSheng007的程序人生 4419

从 Java 到 Kotlin(一)

原文:zh.annas-archive.org/md5/60979b6b5be768c04f4e9f76ebdb673a 译者:飞龙 协议:CC BY-NC-SA 4.0 前言 你好,我是邓肯和纳特。当你阅读这篇前言时,你可能正在考虑是否值得投入时间来阅读本书的其余部分。那么让我们来直接谈谈: 这本书不会教你如何在 Kotlin 中编写计算机程序。 我们开始写一本书,本来是打算的,但很快就明白 Kotlin 是一门庞大的语言,所以这本书将需要比我们期望的更长时间来写。在这个领域已经有一些很棒的书籍,

龙哥盟 1063

又一巨头从Java迁移到Kotlin:关键应用全部开始切换、安卓代码库超过千万行Kotlin代码

Meta 现在爱 Kotlin 多于 Java。Facebook 母公司 Meta 正在将其 Android 应用的 Java 代码迁移到 Kotlin。根据 Meta 的官方博客所述,旗下包括 Facebook、Instagram、Messenger、Portal 和 Quest 在内的应用都已经开始从 Java 转向 Kotlin。

yuyanhome的博客 6475

Java 如何改为Kotlin(二)

Java 如何改为Kotlin(二) 针对集合的操作 Kotlin 提供各类集合转换,通过扩充 Java Collections API 的功能,加快开发速度并提升安全性。 map 函数 该函数会返回一个新列表,包含对原数组中每个元素调用指定转换函数后的结果。这样,我们就不必手动创建新列表并对用户列表进行迭代,而可以使用 map 函数,并替换 map 内部 for 循环中的逻辑. 例如: val formatUserNames: List<String> get() {

K_Hello的博客 368

一、Kotlin 开发环境搭建

来构建项目,所以实际项目一般创建的都是基于。语言后,我们还应该知道:Gradle。-> 在包名目录下创建出一个。切换其他版本,改下版本号即可。-> 输入包名 (同创建。项目中我们一般都会使用。工程时语言可以直接选择。配置 使我们的工程支持。文件夹用来存放源码文件。工程名) -> 选择。工程时,选择的语言是。(其他默认配置即可)

zengkaiqiang562的博客 2969

Java 调用 Kotlin(一)

     最近的项目大多数是kotlin代码,然而有的时候自己写了一些java代码,java调用kotlin当时就有点蒙蔽了,在一定得取经之后,写下当时的“心酸泪史”     protected 区别:          1)Kotlin 继承 Java 时,可以直接拿到 protected 属性          2)Kotlin 继承 Kotlin 时也一样          3)但是 Jav...

SophieBryant的博客 3382

kotlin笔记 十二 (一)java与Kotlin互调

java与Kotlin互调 第一部分 Kotlin中调用Java 1、属性 Kotlin调用、修改属性、就是访问getter、setter方法,只要Java提供getter、setter方法,该属性在Kotlin中就会被当成读写变量,只提供了getter方法,被当成只读属性; 注意:如果getter返回值是boolean类型,该getter方法名是以is开头,Kotlin会将其当成属性名与gett...

Leslie_LN的博客 1018

java调用kotlin callback 和 kotlin调用kotlin callback,java callback

/** * kotlin文件中 Java类使用Java的callback */ //第一种写法 JavaManager().setJavaCallback(JavaCallback { println(it) }) //第一种方法取别名 JavaManager().setJavaCallback(JavaCallback { aaa -> println(aaa) }) //第二种写法 .

Goals1989的博客 3569

Java实践(一)Kotlin与Java在Android生态中的竞争与互补关系

以下从语言特性、应用场景、技术生态、发展趋势四个维度系统分析Kotlin与Java在Android生态中的竞争与互补关系,文中技术细节均基于官方文档与产业实践。

致力于硬件设计、人工智能知识及技术的分享,不断鞭策自己成长,共同进步! 1333
上一篇: 在 Android 开发中使用常见的 Kotlin 模式
下一篇: Git 开发中使用到的命令
K_Hello
博客等级 码龄12年 33粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值