Java 如何改为Kotlin(二)

Java 与 Kotlin 对比学习指南(二) 涵盖语法、设计理念和实际场景的深度对比,帮助您从 Java 平滑过渡到 Kotlin。通过对比学习,可以更深入理解 Kotlin 的设计哲学,写出更简洁、安全的代码! 阅读详情
Java 如何改为Kotlin(二)
针对集合的操作

Kotlin 提供各类集合转换,通过扩充 Java Collections API 的功能,加快开发速度并提升安全性。

map 函数

该函数会返回一个新列表,包含对原数组中每个元素调用指定转换函数后的结果。这样,我们就不必手动创建新列表并对用户列表进行迭代,而可以使用 map 函数,并替换 map 内部 for 循环中的逻辑. 例如:

 val formatUserNames: List<String>
        get() {
            return users!!.map { user ->
                val name = if (user.lastName != null) {
                    if (user.firstName != null) {
                        "${user.firstName} ${user.lastName}"
                    } else {
                        user.lastName ?: "Unknown"
                    }
                } else {
                    user.firstName ?: "Unknown"
                }
                name
            }
        }

为进一步简化,我们还可完全移除 name 变量

val formatUserNames: List<String>
    get() {
        return users!!.map { user ->
            if (user.lastName != null) {
                if (user.firstName != null) {
                    "${user.firstName} ${user.lastName}"
                } else {
                    user.lastName ?: "Unknown"
                }
            } else {
                user.firstName ?: "Unknown"
            }
        }
    }
属性和支持属性

示例:

Repository 类中存在可变的用户列表,该列表会在函数 getUsers 中公开,而该函数则由 Java 代码生成,具体如下:

fun getUsers(): List<User>? {    return users }

但此处存在一个问题:由于返回 users,Repository 类的任何使用者都能够修改用户列表,这并不是一种明智的做法!下面我们将使用支持属性解决这一问题。

首先,将 users 重命名为 _users。然后添加公用的不可变属性,使其返回用户列表。将其命名为 users,具体如下:

private val _users = mutableListOf<User>()
val users:List<User>
 get() = _users

进行此项更改后,私有 _users 属性将变为公用 users 属性的支持属性。在 Repository 类外部,由于该数据类的使用者只能通过 users 来访问 _users 列表,因此该列表不可变,也不可以在外部调用其add方法,如

Repositoryk.getUsers().add(...) // 该方法不可以调用
顶层函数与扩展函数及其各自属性

Kotlin 支持在任何类、对象或接口的外部声明函数和属性。例如,用于创建新 List 实例的 mutableListOf() 函数便直接在标准库内的 Collections.kt 中定义

在 Java 中,每当需要一些实用程序功能时,您大都会创建一个 Util 类,并将该功能声明为静态函数。而在 Kotlin 中,您可以声明顶层函数,无需使用类。不过,Kotlin 还支持创建扩展函数。这些函数可扩展特定类型,但在该类型外部声明。因此,它们与该类型具有亲和性

当我们缺少某个类的所有权,或由于某个类不允许继承时,我们均需扩展该类的功能。为此,Kotlin 已创建名为扩展的特殊声明。Kotlin 支持扩展函数和扩展属性。

您可使用可见性修饰符来限制扩展函数及扩展属性的可见性。这些修饰符仅向需要扩展的类开放扩展功能,且不会污染命名空间。

对于 User 类,我们可以添加一个扩展函数以计算格式化名称,或将格式化名称存放于扩展属性中。我们可以在 Repository 类的外部但位于同一文件中添加该扩展函数,具体如下:

// extension function
fun User.getFormattedName(): String {
    return if (lastName != null) {
        if (firstName != null) {
            "$firstName $lastName"
        } else {
            lastName ?: "Unknown"
        }
    } else {
        firstName ?: "Unknown"
    }
}

// extension property
val User.userFormattedName: String
    get() {
        return if (lastName != null) {
            if (firstName != null) {
                "$firstName $lastName"
            } else {
                lastName ?: "Unknown"
            }
        } else {
            firstName ?: "Unknown"
        }
    }

// usage:
val user = User(...)
val name = user.getFormattedName()
val formattedName = user.userFormattedName

然后,我们便可使用这些扩展函数和扩展属性,就如同它们是 User 类的组成部分一般

由于格式化名称是 User 的一个属性,而非 Repository 类的某项功能,因此我们应该扩展属性。Repository 文件内容现如下所示:

val User.formattedName: String
    get() {
        return if (lastName != null) {
            if (firstName != null) {
                "$firstName $lastName"
            } else {
                lastName ?: "Unknown"
            }
        } else {
            firstName ?: "Unknown"
        }
    }

object Repository {

    private val _users = mutableListOf<User>()
    val users: List<User>
      get() = _users

    val formattedUserNames: List<String>
        get() {
            return _users.map { user -> user.formattedName }
        }

    init {

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

        _users.add(user1)
        _users.add(user2)
        _users.add(user3)
    }
}

Kotlin 标准库使用扩展函数来扩展多个 Java API 的功能;Iterable 和 Collection 上的许多功能则以扩展函数的形式实现。例如,我们在上一步使用的 map 函数即为 Iterable 上的扩展函数

作用域函数:let、apply、with、run、also

为了仅在特定对象的上下文中执行代码,而无需根据名称来访问该对象,Kotlin 专门创建了 5 个作用域函数,即:let、apply、with、run 和 also。这些函数虽简洁但功能强大,它们均具有接收器 (this),可以带有参数 (it),还有可能返回值。您可根据自己想要实现的目标,以决定使用哪个函数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D4b8l8XQ-1602485944287)(C:\Users\Administrator\Pictures\作用域函数.png)]

由于要在 Repository 中配置 _users 对象,我们可以使用 apply 函数,让代码更加符合使用习惯,具体如下:

init {
    val user1 = User("Jane", "")
    val user2 = User("John", null)
    val user3 = User("Anne", "Doe")
   
    _users.apply {
       // this == _users
       add(user1)
       add(user2)
       add(user3)
    }
 }

您可在官方文档中阅读有关作用域函数的更多内容

进一步优化Repository类,即直接在声明中通过用户对 _users 列表进行实例化,从而免于使用 init 块,具体如下:

private val users = mutableListOf(User("Jane", ""), User("John", null), User("Anne", "Doe"))

最后的文件如下:

User.kt

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

Repository.kt

val User.formattedName: String
    get() {
       return if (lastName != null) {
            if (firstName != null) {
                "$firstName $lastName"
            } else {
                lastName ?: "Unknown"
            }
        } else {
            firstName ?: "Unknown"
        }
    }

object Repository {

    private val _users = mutableListOf(User("Jane", ""), User("John", null), User("Anne", "Doe"))
    val users: List<User>
        get() = users

    val formattedUserNames: List<String>
        get() {
            _users.map { user -> user.formattedName }
        }
}

以下是 Java 功能及对应至 Kotlin 的概要:

JavaKotlin
final 对象val 对象
equals()==
=====
仅存放数据的类data 类
构造函数中的初始化init 块中的初始化
static 字段和函数在 companion object 中声明的字段和函数
单一实例类object

参考:Kotlin for Java

如何使用Java调Kotlin,今天开始使用Kotlin 如何使用Java调Kotlin:今天开始使用Kotlin Kotlin 一个极好的点就是完全和Java融为一体。这个意味着,即使你的应用代码是使用Java写的,你能用Kotlin创建一个类,然后使用Java调用它不产生任何问题。 这至少给你带来2个潜在优势: 你能在Java项目中使用Kotlin:在任何你已经开始的项目中,你可以决定使用Kotlin写新的代码。你也可以用Java代码调用它。 如果你在使用Kotlin的时候有障碍,那这部分可以用Java代替:许多人问我,如果你在Androi 阅读详情

相关推荐

Java转Kotlin学习(二)

Java面试Offer直通车 标识符和关键字 标识符 标识符就是变量、常量、函数、属性、类、接口和扩展等由程序员指定的名字。 标识符命名规范 区分大小写,也就是说Myname与myname是两个不同的标识符。 首字符,可以是下划线但是不可以是数字。 除首字符以外其他字符,可以是下划线、字母和数字。 硬关键字不能作为标识符,软关键字、修饰符关键字在它们的使用场景之外可以作为标识符使用。 ...

知道的越多,不知道的越多。 972

Ubuntu17.10 Pycharm(Community or Professional install)安装

很不幸,Ubuntu在我的不慎操作下崩了。。。重装系统之后又要装pycharm,这里记录一下。 1.下载(进入官网之后选择专业版) http://www.jetbrains.com/pycharm/download/ 2.默认下载在downloads里面,进入downloads目录下 cd Downloads/ 3.解压缩当前目录下 tar xzf pycharm*...

funnyPython的博客 2847

sap2000 api matlab,SAP2000_API入门指南.pdf

SAP2000_API入门指南北 京 金 土 木 软 件 技 术 有 限 公 司Beijing Civil King Software TechnologyCo., Ltd.SAP2000 API 入门指南余承飞 韦群跃 汤娣概述SAP2000 API 是从 SAP2000 V11 开始引进的,即应用软件编程接口。用户可以编写程序,通过API 随心所欲地调用 SAP2000...

weixin_42118423的博客 1941

求助,同志们 idea 无法打开

现在打不开了,卸载重装了也一样

m0_62719289的博客 7574

利用腾讯云轻量服务器快速搭建网站CDN

腾讯云的轻量最近在主机和站长中间可谓是占尽来风头,优秀的线路,低廉的价格使得越来越多的人开始使用腾讯云的轻量级服务器来部署应用。由于腾讯云轻量服务器的海外服务器电信走的是CN2GIA线路带宽30m挺适合做CDN的,我就记录一下如何利用腾讯云香港的轻量服务器搭建一个CDN。 购买服务器 首先选购服务器,最近腾讯云在做活动,力度很大国内备案用户可以选用国内的服务器最低128元/年,未备案的可以选用香港或者新加坡的服务器。 购买链接 服务器系统选Debian、Ubuntu、centos都可以 一键脚

demo_top的博客 2565

RHCSA Linux环境搭建

安装Linux操作系统一般有三种方式:为了便捷方便高效,因此本人选择通过虚拟机来使用Linux操作系统。先在官网(Download VMware Workstation Pro)下载好VMware workstation pro软件,下载安装完成后,需要激活打开。下载版本不同,所需激活码也不同(激活码可在网络上查找)

weixin_68256171的博客 1421

解决开启Windows沙盒及Hyper-V后Jetbrains全家桶启动失败

前言 最近,Win10安装了Windows沙盒和基于WSL2的Ubuntu子系统,但是随后发现了Jetbrains系列的所有软件启动失败。 下面是Jetbrains的Phpstorm启动失败截图和报错代码:Internal error. Please refer to https://jb.gg/ide/critical-startup-errors java.lang.NullPointerException at java.desktop/javax.swing.plaf.basic.Ba

Vicosna的博客 5479

GPU算力租用平台推荐

阿里云作为中国领先的云计算服务提供商,提供了丰富的GPU云服务器实例,包括NVIDIA Tesla V100、A100等多种高性能GPU型号。阿里云GPU云服务器适用于深度学习、科学计算、图形渲染等多种场景,能够满足不同用户的计算需求。

hong161688的博客 8173

jdk版本与jvm对应版本_JVM新秀Kotlin获得第一个里程碑版本

最新的语言加入了JVM上那些可执行文件的列表,到目前为止, Kotlin经历了2012年的狂风 。 一月份,它以完全可测试的预览形式向公众揭晓,第二个月又向围观者开放 。 现在,我们可以看到拥有完整版JetBrains静态类型语言的第一个重大飞跃,其中具有里程碑1可供查看。 为了与IntelliJ无缝集成,Kotlin考虑了以下目标: 编译为JVM / JavaScript, K...

798

华为OD机考双机位C卷 - 池化资源共享 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 池化资源共享 (OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 1072

杰理AC696N系列芯片外部中断使用教程

本教程详细介绍了杰理AC696N芯片的GPIO引脚中断唤醒功能实现方法。主要内容包括: 功能特点: 支持任意GPIO引脚配置为中断源 可灵活选择上升沿或下降沿触发 提供自定义中断回调函数接口 核心实现: 通过port_wkup_interrupt_init()函数配置GPIO属性 使用request_irq()注册中断服务程序 提供中断使能/关闭接口 注意事项: 此功能在低功耗模式下无效 需注意引脚冲突和中断优先级设置 建议在回调函数中实现简洁的逻辑 应用场景: 按键检测 外部信号监测 事件触发等 本方案提

qq_42014563的博客 944

Windows下使用最新的JDK1.7.0_51以上版本连接Jenkins出现SecurityException

我在slave节点上安装了jdk1.8, 当在节点上启动slave-agent的时候,报安全性限制的错误: java.lang.SecurityException: Missing required Permissions manifest 网上查资料后,发现是由于最新版本的 Java 7 Update51版本升级中加入了下面的安全性的机制导致的Improved security s...

weixin_33994444的博客 198

论文分栏前后内容不连续?教你word如何删除分节符

问题 当我们在写论文的时候,很多期刊的模板都是两栏的格式,但有的时候我们插入的图像尺寸可能太大,两栏格式放不下,因此需要将其以一栏的格式出入,如下: 但当我们把图片删除后,再将其转换成两栏格式,前后内容就出现不连续的情况: 正常情况下应该是如下: 正确处理方式 里面有个分页符,把分页符去掉,或者把你的文字全部复制到记事本里,然后重新复制回word就可以取消原有的格式了。 删除分节符的方法(以word 2019为例) -点击菜单栏上的“视图”,点击“大纲视图”。 可以看到word文档以整列的形式展开:

左手の明天的博客 1万+

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

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Camera2Demo

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

Java 如何改为Kotlin(一)

重构为Kotlin 文章目录重构为Kotlin准备User类声明可空性、val、var 和数据类对象初始化、伴生对象和单一实例Kotlin 的"静态"属性与"静态"方法处理单一实例解构处理可空性运算符:字符串模板和 if 表达式 准备User类 public class User { private String firstName; private String lastName; public User(String firstName, String lastName) {

K_Hello的博客 1681

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【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万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

秒懂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

【Kotlin】Kotlin 与 Java 互操作 ③ ( Kotlin 中处理 Java 异常 | Java 中处理 Kotlin 异常 | @Throws 注解处理异常 | 函数类型互相操作 )

一、Kotlin 中处理 Java 异常 1、Java 中异常操作 2、Kotlin 中调用 Java 抛出异常函数 3、分析 Kotlin 字节码信息 4、Kotlin 中捕获异常 二、Java 中处理 Kotlin 异常 1、Kotlin 方法中抛出异常处理 2、Java 中调用 Kotlin 异常方法 3、使用 @Throws 注解注明异常 三、Kotlin 与 Java 之间的函数类型互操作 1、Java 调用 Kotlin 中的 匿名函数解决方案 2、Kotlin 中 匿名函数代码示例

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

Kotlin 基本介绍(二)

使用 IntelliJ IDEA 或 Android Studio 可以获得最佳体验。使用 KOTLIN 在线游戏场,无需安装即可试用 KOTLIN。Kotlin 的 IntelliJ IDEA 插件是。在 IntelliJ IDEA 中使用转换器非常简单。在您开始学习 Kotlin 时,转换器可以在。,幸运的是,我们创建一个不错的小捷径。在大多数实际情况下,会。Kotlin 是一种。

面向价值,效用至上 1019

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

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

Goals1989的博客 3568

无涯教程-Kotlin - Java调用Kotlin

由于Kotlin与Java语言完全兼容。这意味着可以轻松从Kotlin调用用Java代码编写的应用程序。以类似的方式,还从Java代码中调用了Kotlin代码。在讨论如何从Java代码调用Kotlin代码之前,让无涯教程看一下Kotlin文件的内部外观。让无涯教程在文件中创建一个简单的主函数。

无涯教程 988

Kotlin 能取代 Java 吗?

作者 |Paresh Sagar译者 |安翔责编 | 伍杏玲出品 |优快云(ID:优快云News)当谈到 Android 应用程序开发时,哪种编程语言会首先出现...

优快云资讯 5282

_Kotlin_系列_ 二、Kotlin泛型

其实通过上面两个例子可以发现,当我们定义一个子类继承一个泛型父类,并给这个泛型一个类型,我们就可以获取到这个泛型类型//定义一个子类继承泛型父类,并给这个泛型一个实际的类型//匿名内部类,其实我们定义的这个匿名内部类也是一个子类,它继承了泛型父类,并给这个泛型一个实际的类型因此如果我们想要获取某个泛型类型,我们可以通过子类的帮助去取出该泛型类型,一种良好的编程实践就是把当前需要获取的泛型类用 abstract 声明1)、当你只想读取值的时候,使用extends T>

2401_84408437的博客 1063

Kotlin和Java区别

哈哈哈,前段时间,面试的时候,突然问到我Kotlin和Java的区别,一下子把我问懵逼了,确实没遇到问这个的,想了下,说了下Kotlin的编译时空检查机制,代码更简洁,很多封装好的API可以直接调用,Kotlin有Jetpack全家桶,有协程,有lateinit和by lazy懒加载机制等等,后面着重问我协程去了,但是我知道我也有很多没有答上。

Android 领域开发程序员,希望通过写博客的方式不断的总结提升自己,大家共同进步哦! 2815

【Kotlin 初学者】Java和Kotlin互操作

Java世界里所有对象都是null,当一个Kotlin函数返回String类型值,它是可空的。

帅次的博客 4801
上一篇: Git 开发中使用到的命令
下一篇: 物联网Wi-Fi配网方式
K_Hello
博客等级 码龄12年 33粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值