什么是代数数据类型(ADT)?
比如通过常见的枚举来创建一个简单的代数数据类型。
常见的代数类型是“和”类型与“积”类型。
代数:就是能代表数字的符号。像一元方程:
x+5=6
y*3=21
上面的x,y 就是代数,x代表数字1,y代表数字7。
对于操作符:“+”和“*”,通过代数和操作符能做什么?
x*1=z
a+2=c
像上面的x 与1相乘得到新的代数。a与2相加得到一个新的代数c。
如果上面的代数与数字转换成编程语言中方的类或者值,再通过某种操作得到新类型?
将这些代数或者数字转换成类型,那么这种被我们用代数或者数字换成的类型,以及通过这些类型所产生的新类型就叫做代数数据类型。
代数数据类型与when表达式组合使用
例:
根据一些条件来计算下面几种图形的面积:
1.圆形(给定半径)
2.长方形(给定长和宽)
3.三角形(给定底和高)
首先将上面的图形抽象成ADT,上面图形的共同点,即它们都是几何图形(Shape)。所以可以利用密封类进行抽象:
sealed class Shape {
class Circle(val radius: Double) : Shape()
class Rectangle(val width: Double, val height: Double)
class Triangle(val base: Double, val height: Double)
}
上面代码将图形抽象成了ADT,整个Shape就是一个和类型,其中的Circle、Rectangle、Triangle就是通过将基本类型Double构造成类而组合成的积类型。
利用when表达式定义一个计算各个图形面积的方法:
fun getArea(shape: Shape): Double = when (shape) {
is Shape.Circle -> Math.PI * shape.radius * shape.radius
is Shape.Rectangle -> shape.width * shape.height
is Shape.Triangle -> shape.base * shape.height / 2.0
}
通过ADT和when表达式,上面计算面积的代码非常简洁,不必使用if-else表达式。
参考Kotlin核心编程