带你踏入kotlin大门(四)|基本功_逻辑控制篇

简介: 本系列的上一篇文章中,笔者给大家讲述 kotlin 中的 头等公民 ——函数,相信 Kotlin 中函数的简单使用大家都很熟悉了,现在继续给大家讲述 Kotlin 中的逻辑控制语句。

前置知识

  • 已学习 Kotlin 变量、函数知识
  • Java 编程基础

前言

本系列的上一篇文章中,笔者给大家讲述 kotlin 中的 头等公民 ——函数,相信 Kotlin 中函数的简单使用大家都很熟悉了,现在继续给大家讲述 Kotlin 中的逻辑控制语句。

本篇主要讲述三大执行语句中的 条件判断语句循环语句,由于顺序执行语句与 Java 一样,没什么特点,我们前面文章中也多次使用过了,这里便不再赘述。

1.webp.jpg

条件判断语句

if 语句

Kotlinif 语句的实现和 java 中的 if 是没有太大区别的。我们需要关注的是其特性表达式化这些与 Java 不同的地方。

首先,我们依旧是用一段简单的 Java 代码来进行变化。

public int numMax(int num1, int num2){
    int res = 0;
    if(num1 > num2){
        res = num1;
    }else{
        res = num2;
    }
    return res;
}
复制代码

转化为 Kotlin 之后,是如下方的代码。这一段转换,使用到的是我们前文中使用到的一些内容,直接把函数给转化。

fun numMax(num1: Int, num2: Int): Int{
    var res = 0
    if(num1 > num2){
        res = num1
    }else{
        res = num2
    }
    return res
}
复制代码

但是上面这段代码的转化,显然是少一些 Kotlin 的特点的。什么特点呢?首先是 if 函数自身的特点。if 函数可以 表达式化/函数化 ,在这种情况下,可以直接把每个条件下的最后一条语句作为返回值。这是什么意思呢?具体看下面的代码变化。

fun numMax(num1: Int, num2: Int): Int{
    var res = if(num1 > num2){
        num1
    }else{
        num2
    }
    return res
}
复制代码

由上面的代码我们可以看到,当其 res 的赋值是表达式的时候,表达式中最后一行不能出现 res = xxx 这种类型的语句,因为 if 语句变为表达式的时候,是需要把最后一行作为结果返回的,所以最后一行需要是一个结果。

我们再次把它变化得更具 Kotlin 风格,这次是将 if 表达式直接作返回值返回。

fun numMax(num1: Int, num2: Int): Int{
    return = if(num1 > num2){
        num1
    }else{
        num2
    }
}
复制代码

同样的,既然函数体里面只返回一个 if 表达式,那么我们可以直接把 if 表达式继续向外提出,让整个函数体变为一个 if 表达式的结果。变化后的代码如下。

fun numMax(num1: Int, num2: Int) = if(num1 > num2) num1 else num2
复制代码

是的,这段代码最后变成了一行代码了,变成了纯表达式化的代码。这里要注意的是,把整个函数变成 if 表达式之后,对应的函数的声明也去掉了,这正对应我们上一篇文章所讲的知识点。

when 语句

Kotlin 中的 when 语句,大家初次听也许感觉很陌生。但是事实上,你可以将其看作是 Javaswitch 语句的加强版本。在 Kotlin 中,已不再有 switch 语句,全面使用 when 语句替代。when 语句即保留了 swich 语句的多重判定,同时又让其使用变得无比简洁且可接收各种类型的参数。所以,你也可以把 when 理解为多重 if 的简化版。

我们依旧以 Java 版本,先写出一段多重 if 语句代码。这里为什么不以 switch 举例?是因为 switch 语句直到在 jdk 1.7 以下只支持 int 类型变量,所以此处不以其作为例子。

下面的这段代码很简单,就是对传入的字符串作判断,根据不同的字符串来返回不同的整形数值。

public int checkString(String s){
    int sNum = 0;
    if(s.equals("a")){
        sNum = 1;
    }else if(s.equals("b")){
        sNum = 2;
    }else if(s.equals("c")){
        sNum = 3;
    }
    return sNum;
}
复制代码

将上述的代码转化为 Kotlin ,使用 when 语句来编写,就是如下的样式:

fun checkString(s: String) = when(s){
    "a" -> 1
    "b" -> 2
    "c" -> 3
    else -> 0
}
复制代码

是否顿时觉得变得无比明了简单呢!你会发现这种形式更加的适合人的思维。相比于 switch 和多重 if,这也让我们的代码编写过程变得更加简单。

从上面的示例代码,我们可以看出三点。

  1. when() 语句可以传入参数,事实上这个参数可以是任意类型的;
  2. when 下边的代码编写格式为:"匹配条件" -> {} ,这里没有了{}包含的函数体,是因为它是单行的,所以将其视为表达式,把 {} 省略了;
  3. when 语句需要返回值的时候,是以每个条件下的最后一行表达式作为返回值

但是 when功能远不止于此,让我们来看一下下面的代码。

fun checkInt(i: Any) = when(i){
    in 1..20 -> 1 //1
    is Long,Double -> 2 //2
    13 -> 3     //3
    else -> 0
}
复制代码

可以看到,上文中的每行的表达式和前面代码不一样了,其实这正体现了 when 广阔的判断功能。

上述的 注释1 处,判断 i 是否在 [1,20] 的区间内,其中 in 和 1..20 这两种用法,我在接下来的循环语句中会讲述含义和用法;

注释2 处,判断 i 是否为 Long 或者 Double 类型的,is 我们可以理解为 Java 中的 instanceof ,用于查看是否为对应子类的;

注释3 处,便是和前面一样,判断是否为13了。

1.webp.jpg

同时,当带有参数的功能不再满足于现有要求的时候,我们还可使用无参的 when 语句

fun checkString(s: String) = when{
    s.length == 2 -> 1
    s.startsWith("a") -> 2
    s == "c" -> 3
    else -> 0
}
复制代码

上述这段无参的 when 语句块,让我们的代码变得更加灵活,使得可以对各种外部的属性作判断,也可以对属性作各种 Boolean 类型的逻辑判断。所以说,when 更像是多重 if 的简约版本,功能强大的同时,使用也便捷。

1.webp.jpg

循环语句

Kotlin 中的循环语句,包括 whilefor 这两种循环语句。其中,while 语句和 Java 中的一样,倒是 for 语句在 Kotlin 中有很多不同,所以只在此介绍 for 语句。

for 语句

Kotlin 中的 for 语句,完全摒弃了传统的 for-i 循环,全面使用 for-each 循环。但是同时也对 for-each 循环做了一个拓展,让其变得简单易用。

在 Kotlin 中,我们可以将改进后的 for-each 循环称之为  for-in 循环。老规矩,我们先上一段 Java 代码,再对其进行转化。

private final List<ShoppingCartItem> items = new ArrayList<>();
public List<ShoppingCartItem> getItems() {
    List<ShoppingCartItem> copyItems = new ArrayList<>();;
    for (ShoppingCartItem i : items){//1
        copyItems.add(i.clone());
    }
    return Collections.unmodifiableList(copyItems);
}
复制代码

上面这段代码来自于我的 设计模式系列 中。可以看到上述的代码的注释1处使用了 for-each 。我们将其转化为 Kotlin 之后是这样子的。

private val items: MutableList<ShoppingCartItem> = ArrayList()
fun getItems(): List<ShoppingCartItem> {
    val copyItems: MutableList<ShoppingCartItem> = ArrayList()
    for (i in items) {//1
        copyItems.add(i.clone())
    }
    return Collections.unmodifiableList(copyItems)
}
复制代码

可以看到,最不一样的地方,就是  for-each 中的 :变成 in 了。这里是遍历集合,我们很好理解。

但是,要实现 Java 的 for-i 的用法该怎么办呢?在 Kotlin 中也有对应拓展的。

在介绍之前,我们先学习几个知识。

0..10 //代表的是 [0,10],左闭右闭
0 until 10 //代表的是 [0,10),左开右闭
复制代码

由此,我们可以写出 for-i 中1遍历到10的代码为:

for (i in 0..10) {           // Loop over a range from 0 to 10
    print(i)
}
复制代码

使用 until 关键字, for-i 中1遍历到10的代码可以写成:

for (i in 0 until 11) {           // Loop over a range from 0 to 10
    print(i)
}
复制代码

Kotlin 中的  for-in 默认是正序且步长为1的,我们可以分别使用 downTostep 两个关键字对其作更改 。

for (i in 10 downTo 1 step 2) {
    print(i)
}
复制代码

上述代码的运行结果为:

1.webp.jpg



相关文章
|
安全 Java 大数据
带你踏入Kotlin大门(一)|kotlin初识
作为一名 Java 使用者,相信大家对 Java 的各种规范已经深入了解,这些规范是一种行业标准,它使得 Java 具有了更好的兼容性。但随着函数式编程的兴盛,这些规范又开始束缚了开发者的创造,成为了拖累 Java 的因素。
|
存储 Java 编译器
带你踏入kotlin大门(二)|基本功_变量篇
本篇正式开启 kotlin 的学习历程,带你正式踏入 kotlin 大门。
带你踏入kotlin大门(二)|基本功_变量篇
|
Java API Kotlin
带你踏入kotlin大门(三)|基本功_函数篇
本文给讲述 kotlin 中的 头等公民 ,函数。
带你踏入kotlin大门(三)|基本功_函数篇
|
设计模式 Java 开发者
带你踏入kotlin大门(五)|基本功_类和继承篇
本篇作为 Kotlin 基本功的倒数第二篇,将为大家带来关于 Kotlin 中类和继承的知识。如果你看到这篇文章的时候,还未听说过 Kotlin 或者从未学习过 Kotlin ,你可以点击链接从本系列的第一篇文章开始学习。
带你踏入kotlin大门(五)|基本功_类和继承篇
|
设计模式 安全 Java
带你踏入Kotlin大门(六)|基本功_接口和特殊类篇
这篇文章是我们 Kotlin 基础章系列的最后一文了,前面我们利用了5篇文章讲解了 Java 开发者如何学好 Kotlin 的基本用法,每篇文章的篇幅都不长,可以在空余时间快速阅读,笔者希望学习完前五篇,再来学习这最后一篇文章,会更加的容易理解。
|
21天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
22天前
|
数据库 Android开发 开发者
构建高效Android应用:Kotlin协程的实践指南
【4月更文挑战第2天】随着移动应用开发的不断进步,开发者们寻求更流畅、高效的用户体验。在Android平台上,Kotlin语言凭借其简洁性和功能性赢得了开发社区的广泛支持。特别是Kotlin协程,作为一种轻量级的并发处理方案,使得异步编程变得更加简单和直观。本文将深入探讨Kotlin协程的核心概念、使用场景以及如何将其应用于Android开发中,以提高应用性能和响应能力。通过实际案例分析,我们将展示协程如何简化复杂任务,优化资源管理,并为最终用户提供更加流畅的体验。
|
1月前
|
调度 数据库 Android开发
构建高效Android应用:Kotlin协程的实践与优化
在Android开发领域,Kotlin以其简洁的语法和平台友好性成为了开发的首选语言。其中,Kotlin协程作为处理异步任务的强大工具,它通过提供轻量级的线程管理机制,使得开发者能够在不阻塞主线程的情况下执行后台任务,从而提升应用性能和用户体验。本文将深入探讨Kotlin协程的核心概念,并通过实例演示如何在实际的Android应用中有效地使用协程进行网络请求、数据库操作以及UI的流畅更新。同时,我们还将讨论协程的调试技巧和常见问题的解决方法,以帮助开发者避免常见的陷阱,构建更加健壮和高效的Android应用。
36 4
|
1月前
|
移动开发 Java Android开发
构建高效Android应用:Kotlin协程的实践之路
【2月更文挑战第31天】 在移动开发领域,性能优化和流畅的用户体验一直是开发者追求的目标。随着Kotlin语言的流行,其异步编程解决方案——协程(Coroutines),为Android应用带来了革命性的并发处理能力。本文将深入探讨Kotlin协程的核心概念、设计原理以及在Android应用中的实际应用案例,旨在帮助开发者掌握这一强大的工具,从而提升应用的性能和响应能力。
|
1月前
|
安全 Android开发 开发者
构建高效Android应用:Kotlin与协程的完美结合
【2月更文挑战第30天】在移动开发领域,性能优化和流畅的用户体验是关键。本文深入探讨了如何通过结合Kotlin语言和协程技术来提升Android应用的性能和响应能力。我们将分析Kotlin的优势,介绍协程的基本概念,并通过实际案例展示如何在应用中实现协程以简化异步编程,从而提供更加高效的解决方案。