Kotlin系列二(kotlin中的操作符)

四.kotlin中的操作符(Operator)

一元操作符

  • 只有一个操作数的操作符称为一元操作符,例如:a++自增操作符就是一元操作符,变量a是唯一一个操作数

一元操作符对应的方法

一元操作符对应的方法
=
+unaryPlus()
-unaryMinus()
++inc()
--dec()
!not()

赋值操作符

  • "="一个等号就是赋值操作符
//1.赋值操作符 =
//将字面量10赋值给变量a
var a = 10;
println("使用赋值操作符给变量a赋值为$a");

运行结果

正操作符(算术操作符)

  • "+"表示操作数的是正数
//将一个正数赋值给变量a
val a = +10;

负操作符(算术操作符)

  • "-"表示操作数是负数
//将一个负数赋值给变量a
val a = -10;

自增操作符

  • "++"自增操作符
    • 前自增,操作数先自增再进行其他操作
    • 后自增,操作数先进行其他操作最后再进行自增
//2.自增操作符 ++
val b = a++;
println("后自增后的值为$b");
val c = ++a;
println("前自增后的值为$c");

运行结果

自减操作符

  • "--"自减操作符
    • 前自减,操作数先自减再进行其他操作
    • 后自减,操作数先进行其他操作最后再进行自减
//3.自减操作符 --
val d = a--;
println("后自减后的值为$d");
val e = --a;
println("前自减后的值为$e");

运行结果

否定操作符(取反操作符)

  • "!"感叹号就是否定操作符,用于对Boolean类型的数据进行取反
//4.取反操作符 !
val f = true;
println("取反前的值为$f,取反后的值为${!f}");

运行结果

二元操作符

二元操作符对应的方法

二元操作符对应的方法
+plus()
-minus()
*times()
/div()
%rem()
+=
-=
*=
/=
%=
>compareTo()
<compareTo()
>=compareTo()
<=compareTo()

四则运算的操作符

  1. "+"加号操作符,相当于调用第一个操作数的plus()方法
  2. "-"减号操作符,相当于调用第一个操作数的minus()方法
  3. "*"乘号操作符,相当于调用第一个操作数的times()方法
  4. "/"除法操作符,相当于调用第一个操作数的div()方法
  5. "%"取余操作符,相当于调用第一个操作数的rem()方法
  6. "+="加法复合操作符,相当于调用第一个操作数的plusAssign()方法
  7. "-="减法复合操作符,相当于调用第一个操作数的minusAssign()方法
  8. "*="乘法复合操作符,相当于调用第一个操作数的timesAssign()方法
  9. "/="除法复合操作符,相当于调用第一个操作数的divAssign()方法
  10. "%="取余复合操作符,相当于调用第一个操作数的remAssign()方法
        //1.四则运算操作符
        val num1 = 10;
        val num2 = 3;
        var result = 0;

        //1.1加法操作符
        result = num1 + num2;
        //等价的方法plus()
//        result = num1.plus(num2);
        //加法操作符: result = num1 + num2,result = 13
        println("加法操作符: result = num1 + num2,result = $result");

        //1.2减法操作符
        result = num1 - num2;
        //等价的方法minus()
//        result = num1.minus(num2);
        //减法操作符: result = num1 - num2,result = 7
        println("减法操作符: result = num1 - num2,result = $result");

        //1.3乘法操作符
        result = num1 * num2;
        //等价的方法times()
//        result = num1.times(num2);
        //乘法操作符: result = num1 * num2,result = 30
        println("乘法操作符: result = num1 * num2,result = $result");

        //1.4除法操作符
        result = num1 / num2;
        //等价的方法div()
//        result = num1.div(num2);
        //除法操作符: result = num1 / num2,result = 3
        println("除法操作符: result = num1 / num2,result = $result");

        //1.5取模操作符
        result = num1 % num2;
        //等价的方法rem()
//        result = num1.rem(num2);
        //取模操作符: result = num1 % num2,result = 1
        println("取模操作符: result = num1 % num2,result = $result");

        //1.6加法复合操作符
        result = 0;
        result += num1;
        //等价下面的写法
//        result = result + num1;
//        result = result.plus(num1);
        //加法复合操作符: result += num1,result = 10
        println("加法复合操作符: result += num1,result = $result");

        //1.7减法复合操作符
        result = 0;
        result -= num2;
        //等价下面的写法
//        result = result - num2;
//        result = result.minus(num2);
        //减法复合操作符: result -= num2,result = -3
        println("减法复合操作符: result -= num2,result = $result");

        //1.8乘法复合操作符
        result = 1;
        result *= num1;
        //等价下面的写法
//        result = result * num1;
//        result = result.times(num1);
        //乘法复合操作符: result *= num1,result = 10
        println("乘法复合操作符: result *= num1,result = $result");

        //1.9除法复合操作符
        result = 10;
        result /= num2;
        //等价下面的写法
//        result = result / num2;
//        result = result.div(num2);
        //除法复合操作符: result /= num2,result = 3
        println("除法复合操作符: result /= num2,result = $result");

        //1.10取模复合操作符
        result = 10;
        result %= num2;
        //等价下面的写法
//        result = result % num2;
//        result = result.rem(num2);
        //取模复合操作符: result %= num2,result = 1
        println("取模复合操作符: result %= num2,result = $result");

运行结果

比较操作符

  1. ">"大于操作符,相当于调用第一个操作数的compareTo()方法
  2. "<"小于操作符,相当于调用第一个操作数的compareTo()方法
  3. ">="大于等于操作符,相当于调用第一个操作数的compareTo()方法
  4. "<="小于等于操作符,相当于调用第一个操作数的compareTo()方法
  • 如果操作数是基本数据类型可以直接使用比较操作符
  • 如果操作数不是基础数据类型,可以让该类显示Comparable接口,然后就可以使用比较操作符
//2.比较操作符
//比较操作符等价的方法是compareTo()
// 该方法返回1表示第一个操作数大于第二个操作数
// 该方法返回-1表示第一个操作数小于第二个操作数
// 该方法返回0表示第一个操作数等于第二个操作数
//2>1=1,2<1=-1,1=1=0
println("2>1=${"2".toInt().compareTo(1)},2<1=${"1".toInt().compareTo(2)},1=1=${"1".toInt().compareTo(1)}");

//2.1大于操作符
//大于操作符: num1 > num2,结果 = true
println("大于操作符: num1 > num2,结果 = ${num1 > num2}");

//2.2小于操作符
//小于操作符: num1 < num2,结果 = false
println("小于操作符: num1 < num2,结果 = ${num1 < num2}");

//2.3大于等于操作符
//大于等于操作符: num1 >= num2,结果 = true
println("大于等于操作符: num1 >= num2,结果 = ${num1 >= num2}");

//2.4小于等于操作符
//小于等于操作符: num1 <= num2,结果 = false
println("小于等于操作符: num1 <= num2,结果 = ${num1 <= num2}");

运行结果

位运算方法

  • kotlin中没有专门的位运算操作符,只有对应的位运算方法
  • 没有无符号左移
kotlin位运算方法对应Java中的位运算操作符含义
and()&按位与
or()|按位或
inv()!按位取反
xor()^按位异或
shl()<<左移
shr()>>右移
ushr()(Java中没有无符号数)无符号右移
 //3.位运算方法
        //3.1位与方法
        result = num1.and(num2);
        //简写
//        result = num1 and num2;
        //0b1010和0b11进行位与操作: result = 10
        println("0b${num1.toString(2)}和0b${num2.toString(2)}进行位与操作: result = ${result.toString(2)}");

        //3.2位或方法
        result = num1.or(num2);
        //简写
//        result = num1 or num2;
        //0b1010和0b11进行位或操作: result = 1011
        println("0b${num1.toString(2)}和0b${num2.toString(2)}进行位或操作: result = ${result.toString(2)}");

        //3.3按位取反操作符,没有简写,符号位也会被取反
        result = num1.inv();
        //0b1010进行位取反操作: result = -1011
        println("0b${num1.toString(2)}进行位取反操作: result = ${result.toString(2)}");

        //3.4异或方法
        result = num1.xor(num2);
        //简写
//        result = num1 xor num2;
        //0b1010和0b11进行异或操作: result = 1001
        println("0b${num1.toString(2)}和0b${num2.toString(2)}进行异或操作: result = ${result.toString(2)}");

        //3.5位左移方法,左移1位
        result = num1.shl(1);
        //简写
//        result = num1 shl 1;
        //0b1010进行位左移操作: result = 10100
        println("0b${num1.toString(2)}进行位左移操作: result = ${result.toString(2)}");

        //3.6位右移方法,右移1位
        result = num1.shr(1);
        //简写
//        result = num1 shr 1;
        //0b1010进行位右移操作: result = 101
        println("0b${num1.toString(2)}进行位右移操作: result = ${result.toString(2)}");

        //3.7无符号右移方法,右移1位
        result = num1.ushr(1);
        //简写
//        result = num1 ushr 1;
        //0b1010进行无符号位右移操作: result = 101
        println("0b${num1.toString(2)}进行无符号位右移操作: result = ${result.toString(2)}");

运行结果

猫王操作符(?:)

  • kotlin中没有三元表达式,只有类似的猫王操作符(Elvis)
  • "?:"猫王操作符,当第一个操作数为空时,返回指定的默认值,第一个操作数不为空时,返回第一个操作数,语法格式:操作数?:默认值
        //4.0猫王操作符
//        var person = null;
        var person = "我正在学习kotlin";
        val res = person?:"空的";
        println("猫王操作符案例,person变量的值是$res");

运行结果

相等操作符

  • kotlin中有两种相等操作符,"等同"和"等于"
  • 在kotlin中
    • 不可空数值类型底层实现为Java的基础类型,所以只要值相同,两者就是"等于"
    • 可空数值类型的底层实现为Java的包装类,所有两个可空的数值变量是不"等于"的
  1. "=="等同操作符,两个操作数的"值"相同时即为等同
  2. "==="等于操作符,两个操作数指向同一个引用时才可以被认为是等于
//5相等操作符,"==" 与 "==="
val a = 10;
val b = 10;
//不可空的数值类型相等,a==b的结果是true,a===b的结果是true
println("不可空的数值类型相等,a==b的结果是${a==b},a===b的结果是${a===b}");
//这里注意范围在8bit内的数值,在Java的包装类中是指向同一引用的,也就是说如果两个可控变量的值为100,则它们使用 === 操作符返回的也是true
val x:Int? = 100;
val y:Int? = 100;
//可空的数值类型相等,x==y的结果是true,x===y的结果是true
println("可空的数值类型相等,x==y的结果是${x==y},x===y的结果是${x===y}");
val n:Int? = 1000;
val m:Int? = 1000;
//可空的数值类型相等,n==m的结果是true,n===m的结果是false
println("可空的数值类型相等,n==m的结果是${n==m},n===m的结果是${n===m}");
//对象类型
val date1 = Date(100);
val date2 = Date(100);
//不可空的对象类型相等,date1==date2的结果是true,date1===date2的结果是false
println("不可空的对象类型相等,date1==date2的结果是${date1==date2},date1===date2的结果是${date1===date2}");

运行结果

"in"和"!in"操作符

  • 这两者属于逻辑操作符
  • "in"操作符,相当于调用第二个操作数的contains()方法,用于判断第一个操作数是否在第二个操作数的范围内
  • "!in"操作符,相当于调用第二个操作数的minus()方法,用于判断第一个操作数是否不在第二个操作数的范围内
//6."in"和"!in"操作符
val s = "我在学Kotlin";
//我在学Kotlin 是否包含'Kotlin'字符串,结果是true,我在学Kotlin 是否不包含'Java'字符串,结果是true
println("$s 是否包含'Kotlin'字符串,结果是${"Kotlin" in s},$s 是否不包含'Java'字符串,结果是${"Java" !in s}");
val arr = arrayOf(1,2,3,4,5);
//[1,2,3,4,5]是否包含数字3,结果是true,[1,2,3,4,5] 是否不包含数字6,结果是true
println("[${arr.joinToString(",")}]是否包含数字3,结果是${3 in arr},[${arr.joinToString(",")}] 是否不包含数字6,结果是${6 !in arr}");

运行结果

"[]"索引操作符

  • 用于操作操作数中指定位置的数据
        //7.索引操作符
        val data = arrayOf('我', '爱', '学', "Kotlin");
        //这里相当于调用变量data的get()方法
        val c = s[0];
        //等价写法
//        val c = s.get(0);
        println("[${data.joinToString()}] 索引0的值为$c");
        //这里相当于调用变量data的set()方法
        data[0] = '你';
        //等价写法
//        data.set(0,"你");
        println("此时,[${data.joinToString()}] 索引0的值为${data[0]}");

运行结果

".."区间操作符

  • ".."区间操作符,两个小点,主要用于创建区间对象,相当于调用第一个操作数的rangeTo()方法
  • 区间两端都是闭区间
        //8.".."区间操作符
        //[1,10]
        val seq =  1..10;
        //等价写法
//        val startNum = 1;
//        val seq =  startNum.rangeTo(10);
        for (i in seq){
            println(i);
        }

运行结果

操作符重写

  • kotlin中的操作符实际上是调用定义在类中的操作符方法,所以只需要我们为自定义的类添加这些方法就可以使用这些操作符
  • "operator"关键字用于修饰操作符方法,每一个操作符方法都必须使用该关键字进行修饰
  • 自定义操作符方法时,也需要使用指定的方法名,如自定义"+"操作符的方法,就必须使用plus()作为方法名
  • 案例:自定义操作符方法,实现蓝色 + 黄色 = 绿色
class Blue{
    private val color = "蓝色";
    //"+"加法操作符重写,使用operator操作符关键字修饰,使用指定的方法名plus()
    operator fun plus(color:Yellow):Green{
        return Green();
    }
    fun info(){
        println("我是$color");
    }
}

class Green {
    private val color = "绿色";
    fun info(){
        println("我是$color");
    }
}

class Yellow {
    private val color = "黄色";
    fun info(){
        println("我是$color");
    }
}

fun main(){
    //操作符重写
    val blue = Blue();
    val yellow = Yellow();
    val green = blue + yellow;
    green.info();
}

运行结果