前言
一 、表示与选择之枚举
1.1枚举的定义
public enum Color
{
RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET
}1234
enum class Color {
RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET
}123
1.2 带属性的枚举类
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;
}
}12345678910111213141516171819202122232425262728293031323334353637383940
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)//定义枚举的方法
}123456789101112
二 、表示与选择之When
2.1 使用“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)) // Battle123456789101112
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)) //warm123456
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"
}12345678
2.2 在"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))//GREEN12345678
2.3 使用不带参数的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)) //GREEN123456789
2.4 代码块作为"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
//7123456789101112131415161718192021
相关视频推荐:
Android 性能优化学习【二】:APP启动速度优化_哔哩哔哩_bilibili
【Android进阶系统学习】:字节码插桩技术实现自动化方法耗时记录_哔哩哔哩_bilibili
Android 性能优化学习【二】:APP启动速度优化_哔哩哔哩_bilibili
【Android面试专题】:面试又被问到进程间通信,你却连Binder是什么都不知道?_哔哩哔哩_bilibili
BAT面试技巧——Android面试必问的网络编程你了解多少?_哔哩哔哩_bilibili