关于android:Kotlin实战三表示与选择

33次阅读

共计 5223 个字符,预计需要花费 14 分钟才能阅读完成。

前言

本章咱们将学习怎么样在 Kotlin 中通过枚举和 when 实现示意与抉择。

一、示意与抉择之枚举

1.1 枚举的定义

咱们来看一下 java 中的用法:

public enum Color
{RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET}

kotlin 中的用法:

enum class Color {RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET}

你会发现 kotlin 中应用 enum 同时还要应用 class 这与 java 中不同,思考下这是为什么?

知识点

在 Kotlin 中,enum 就是 所谓的软关键词 (soft keyword): 当它搁置在 class 关键词之前,它才有特有的意义。然而你能够在其余的中央,把它当成惯例的名字应用。
class 依然是一个关键字,要持续应用 clazzName 之类的来申明变量。
与 java 雷同,枚举中能够申明属性和办法

1.2 带属性的枚举类

先看看 java 中的代码:

public enum Color
{RED(255, 0, 0), // 当每个变量创立的时候,指定属性值
    ORANGE(255, 165, 0), // 逗号是必须的
    YELLOW(255, 255, 0),
    GREEN(0, 255, 0),
    BLUE(0, 0, 255),
    INDIGO(75, 0, 130),
    VIOLET(238, 130, 238);

    private int r;
    private int g;
    private int b;

    Color(int r, int g, int b)
    {
        this.r = r;
        this.g = g;
        this.b = b;
    }

    public int getRGB(){return (r * 256 + g * 256 + b*256);
    }

    public int getR()
    {return r;}

    public int getG()
    {return g;}

    public int getB()
    {return b;}
}

是不是超级多,再来看看 kotlin,是不是少了好多,霎时清新了很多

enum class Color(val r: Int, val g: Int, val b: Int // 申明枚举常量的属性) {RED(255, 0, 0), // 当每个变量创立的时候,指定属性值
    ORANGE(255, 165, 0), // 逗号是必须的
    YELLOW(255, 255, 0),
    GREEN(0, 255, 0),
    BLUE(0, 0, 255),
    INDIGO(75, 0, 130),
    VIOLET(238, 130, 238);
    fun rgb() = (r * 256 + g * 256 + b*256)// 定义枚举的办法
}

从两个例子中能够看出,当你定义一个枚举常量,你须要为它提供属性值。

这个例子中展现了 Kotlin 语法惟一须要分号的中央:在枚举类中如果你定义任何办法,分号辨别了枚举常量列表和办法申明。

接下来咱们看一下枚举的解决:

二、示意与抉择之 When

2.1 应用“when”来解决枚举

接下来咱们应用 when 抉择枚举,咱们输出一个色彩,返回对应的一个字符串

fun getMnemonic(color: Color) =   // 间接返回一个“when”的表达式
    when (color) {                // 如果色彩等于枚举常量,返回响应的字符串
        Color.RED -> "Richard"
        Color.ORANGE -> "Of"
        Color.YELLOW -> "York"
        Color.GREEN -> "Gave"
        Color.BLUE -> "Battle"
        Color.INDIGO -> "In"
        Color.VIOLET -> "Vain"
    }

println(getMnemonic(Color.BLUE)) // Battle

下面代码咱们能够处,你不须要为每个分支写 break 语句(在 java 中脱漏 break 通常会导致 bug)。

能够吧多个值合并到同一个分支,只须要逗号隔开。

如下:

fun getWarmth(color: Color) = when(color) {
    Color.RED, Color.ORANGE, Color.YELLOW -> "warm"
    Color.GREEN -> "neutral"
    Color.BLUE, Color.INDIGO, Color.VIOLET -> "cold"
}
 println(getWarmth(Color.ORANGE)) //warm

下面的例子用全名来应用枚举常量,指定 Color 枚举类名。你能够用导入常量来简化代码:

import ch02.colors.Color // 导入申明在另外一个包的 Color 类
import ch02.colors.Color.*// 用名字显示导入枚举常量

fun getWarmth(color: Color) = when(color) {
    RED, ORANGE, YELLOW -> "warm" // 用名字导入常量
    GREEN -> "neutral"
    BLUE, INDIGO, VIOLET -> "cold"
}

2.2 在 ”when” 构造中应用任意对象

kotlin 中的 when 构造比 java 中的 switch 弱小得多。switch 必须要求应用常量(枚举常量、字符串或者数字字面值)作为分支条件,而 when 能够应用任何对象。

上面咱们写一个混合两者色彩的函数:

fun mix(c1: Color, c2: Color) =
    when (setOf(c1, c2)) {//when 表达式的参数能够是任何实例,用来被分支条件查看
        setOf(RED, YELLOW) -> ORANGE// 枚举能够混合的色彩对
        setOf(YELLOW, BLUE) -> GREEN
        setOf(BLUE, VIOLET) -> INDIGO
        else -> throw Exception("Dirty color")// 执行这个,如果没有分支能够匹配
    }
println(mix(BLUE, YELLOW))//GREEN

Kotlin 规范库中含有一个 setOf 的函数,用来创立 Set,蕴含参数指定的实例;一个 set 是一个汇合,它的项的秩序并不重要。所以,如果 setOf(c1, c2)和 setOf(RED, YELLOW)是相等的,那么意味着要不然 c1 是 RED 和 c2 是 YELLOW,或者相同。

2.3 应用不带参数的 when

下面的例子有点效率低下,因为每次你调用这个函数,它都会创立几个 Set 实例,仅仅是用在查看两个色彩是否匹配另外两个色彩。失常状况下,通常不是个问题。然而如果这个函数常常被调用,那么为了防止 GC,值得用另外一种形式来重写这个代码。你能够用不带参数的 when 表达式实现。代码尽管可读性差一点,然而这是为了达到更好性能付出的代价。

fun mixOptimized(c1: Color, c2: Color) =
    // 没有实参传给 when
    when {(c1 == RED && c2 == YELLOW) || (c1 == YELLOW && c2 == RED) -> ORANGE
        (c1 == YELLOW && c2 == BLUE) || (c1 == BLUE && c2 == YELLOW) -> GREEN
        (c1 == BLUE && c2 == VIOLET) || (c1 == VIOLET && c2 == BLUE) -> INDIGO
        else -> throw Exception("Dirty color")
    }
println(mixOptimized(BLUE, YELLOW)) //GREEN

2.4 代码块作为 ”if” 和 ”when” 的分支

if 和 when 都能够用代码块作为分支。

在这个例子中,代码块中最初最初一个表达式作为后果。如果你想在例子函数中加日志,你能够在代码块中实现,并用最初一个值返回。

fun evalWithLogging(e: Expr): Int =
    when (e) {
        is Num -> {println("num: ${e.value}")
            e.value // 如果 e 是 Num 类型,这是代码块最初一个表达式,并被返回
        }
        is Sum -> {val left = evalWithLogging(e.left)
            val right = evalWithLogging(e.right)
            println("sum: $left + $right")
            left + right// 如果表达式被返回当 e 是 Sum 类型
        }
        else -> throw IllegalArgumentException("Unknown expression")
    }
    println(evalWithLogging(Sum(Sum(Num(1), Num(2)), Num(4))))
    //num: 1
    //num: 2
    //sum: 1 + 2
    //num: 4
    //sum: 3 + 4
    //7

规定:“代码块中最初一个表达式是返回值”,在所有应用代码块并冀望失去一个后果的中央成立。当初曾经学会了如何正确从泛滥选项中作出抉择,下一章咱们一起去看下如何迭代事物。***
文章转自 https://cloud.tencent.com/developer/article/1385735 如有侵权,请分割删除。### 相干视频举荐:[Android 性能优化学习【二】:APP 启动速度优化_哔哩哔哩_bilibili](https://link.segmentfault.com/?enc=DLAI3gpMC5W0XJf2DXZbdw%3D%3D.bmCGNhTnKSXhIifbOuLwt2D5yay%2FCiGq9pbRVABIrLnwR0tNxbfFyy%2Fidl%2FYYt84keb7jSxvhEZTItg7L8MgpPLKnyeBUwIlHfE4i%2B31k3AgYPr685Xp1SvixQEqaI8M9BP%2F9YRyGqvpzZsnqNVC0Q%3D%3D "Android 性能优化学习【二】:APP 启动速度优化_哔哩哔哩_bilibili")
[【Android 进阶零碎学习】:字节码插桩技术实现自动化办法耗时记录_哔哩哔哩_bilibili](https://link.segmentfault.com/?enc=ks3F%2FyIi4aA1ICBTdjG8Vw%3D%3D.kU12pwly7JzXVUubI14Gvr64jWFtJ1DJDrRAGWH7AHiV%2B991FTPkUHJi3f4KZ82%2F24Ou4Ggzi4sScmRBejlfGNemAuz9MI0n%2F4nbx6O1TkvGxBtb%2FevNOZNTm90fe118VirurOtNX8Gc9KKkjDaYbg%3D%3D "【Android 进阶零碎学习】:字节码插桩技术实现自动化办法耗时记录_哔哩哔哩_bilibili")
[Android 性能优化学习【二】:APP 启动速度优化_哔哩哔哩_bilibili](https://link.segmentfault.com/?enc=tXPLumWgPrTuuYionfYsNg%3D%3D.YGlQJzqtufxmfjJin%2FfyzYExBfZ0DoWsJ5fw1MDWrnK%2FxqSJhprit7ILmk7lHFCw3yR4R2PDyUyP9gKLRo%2Bp1g9wVSk%2B9DmmdjlLzLK8TAqf906Pv71HnoE6NApZxRb2n5xRNxvj7lvVZhA%2BDPcakQ%3D%3D "Android 性能优化学习【二】:APP 启动速度优化_哔哩哔哩_bilibili")
[【Android 面试专题】:面试又被问到过程间通信,你却连 Binder 是什么都不晓得?_哔哩哔哩_bilibili](https://link.segmentfault.com/?enc=Taa%2FgUkcnw5nOfpwQdUB5g%3D%3D.T3iHZluEVNYe4qOHoob9JLGyoVumeTj6r1ECJ9wlG7dACNa4VnrDNpgN%2FJV8gi7srbUxElyAa1NlP90lGVDKKyDlqF%2B0zeeB7BJhW4dPBe44GITUf1WIizQyZcdQ%2FJvTpG4IohGNh57dFOX8LdD6ig%3D%3D "【Android 面试专题】:面试又被问到过程间通信,你却连 Binder 是什么都不晓得?_哔哩哔哩_bilibili")
[BAT 面试技巧——Android 面试必问的网络编程你理解多少?_哔哩哔哩_bilibili](https://link.segmentfault.com/?enc=%2FuswdN8QxGpaFV40TlFm%2Bg%3D%3D.2QZK6HjkM2tnCI4QnimKIaSZBGiSNxejY%2B71N1vaKlXDqikIHYSK%2B2VWX9P7AOSt%2Bt2d%2B5ed20teZo3AmtpdsWJr0Ry%2FvCZmfYaBEaIWJDKKSRIRcRIwdNEeAXvCD9sOgUbvuRYPA6j4vKbLp2veyg%3D%3D "BAT 面试技巧——Android 面试必问的网络编程你理解多少?_哔哩哔哩_bilibili")

正文完
 0