字符串模板

在Kotlin中我们可以使用${}这样一种格式在一个字符串中引用一个变量。用法有点类似于Spring框架中的el表达式(记得是这个叫法),或者一些前端框架里也有类似的用法。

fun main(args: Array<String>) {
   println(sayHello("Cyber"));
}

fun sayHello(name:String):String{
    return "您好!${name}";
}

注:这里${}能够引用的变量类型不仅仅适用于String,可适用其他的基本数据类型。除此之外,在它的里面还可以调用函数,通过函数的返回值进行输出


字符串对比

Kotlin与Java的字符串对比区别

kotlin:== 对应 java:equals

kotlin:=== 对应 java:==

注:在java中我们判断两个字符串是否相等,我们会用equal()的方法,但是在kotlin中我们用==来判断,如果想要判断两个字符串的地址值我们使用===来进行判断。

当然,在Kotlin中也可以调用equals方法去达到上述==的效果,其内部其实调用了java中的equals方法。

var str1:String = "aaa";
var str2:String = "Aaa";
println (str1.equals(str2,true));

注:第二个参数是设置是否忽略字母大小写的意思。


空值处理

在调用函数时如果参数传递的是一个null值会报错。如:

fun main(args: Array<String>) {
   println(sayHello(null));
}

fun sayHello(name:String):String{
    return "您好!${name}";
}

这是由于Kotlin自带有空值判断的功能,如果此处代码默认参数可以为null可以这样写:

fun sayHello(name:String?):String{
    return "您好!${name}";
}

在参数的类型旁加一个?代表此参数可以为null,输出结果为:

您好!null

智能类型推断

在Kotlin中可以使用var来定义变量,此关键字可以进行智能类型推断。效果和JS中的var类似。

//i的类型为Int类型
var i = 18;
//此时会发生报错,因为赋值的数值已经超出Int的取值范围           
i = 9999999999999;    

//j被自动判断为是一个Long型的变量
var j = 9999999999999;   

变量在初始化时就会自动判断类型,并且起到绑定作用。再次对此变量做赋值时不能赋予与其不相符的数据类型。

定义的时候也可以显示的声明此变量是什么类型:

var i : Int = 18;                         
var j : Long = 9999999999999;              

注:在变量被定义时如果没有初始化的值时,需要手动声明其类型,否则编译器无法得知此变量是哪种数据类型

var x;              //报错,原因为无预先设置初始化值。
var y : Int;        //通过声明数据类型告知编译器。

var与val

  • var 可以声明一个可读可写的变量,相当于java中的普通变量。
  • val 用于声明一个只读变量,相当于java中用final声明的变量。

两者都能用于定义变量时的智能类型判断。


不可隐式转换

在Kotlin中,并不支持类似java中的自动拆装箱。Int型不可自动转成Long型:

var a : Int = 1;
var b : Long = a.toLong();

使用Kotlin编写一个HelloWorld


fun main(args:Array<String>){
    println("Hello World");
}

fun 函数的声明
args:Array< String > 接受参数名为args,数据类型为String
println("Hello World"); 向控制台输出HelloWorld


定义变量与输出


fun main(args: Array<String>) {
    var name = "111";     //定义一个变量name并赋值为"111"
    name = "222";         //给name重新赋值为"222"  
    println(name);
}

注:Kotlin里的变量定义可使用var,它会根据后面的赋值来自动判断所定义的变量类型。如上述的name就为一个字符串。且需要注意的是如果一开始赋值的是字符串的话则此变量就不能被重新赋值为别的类型。如:

    

var name = "111";     //定义一个变量name并赋值为"111"
name = 2;         //重新赋值为2,此时会报错

在Kotlin中,var用来定义可改变的变量,而val用来定义不可改变的变量,相当于java中的final。

前言

最近在学习如何实现后台定时处理订单过期的效果。这里使用Quartz框架去做定时器的操作。


Quartz

使用Quartz作为定时器,它的原理是通过设置一个触发器和一个触发后所需要执行的方法(job类)。设定一个触发的时间,当然还有其他可以设置的参数,这里的触发器在官方文档中分为两种。这里我只用到了一个规定触发时间的:CronTrigger。


配置

这里我做的定时器是一个全局定时器,即在服务器启动的时候就会开始工作。配置的内容在xml中,当然也可以通过java代码配置,java代码的配置可以百度w3cschool的Quartz文档。

  • 创建一个定时工作执行的方法实体:

    @DisallowConcurrentExecution
    public class ResWholeTimer{
    public void executeCancel() throws JobExecutionException{

      System.out.println("取消订单"+new DateTime().toString());

    }
    }

  • 在spring配置文件中配置:

    <!-- 配置取消订单job类  -->

    <bean id="handleResWhole" class="com.eooker.lafite.modules.veh.entity.ResWholeTimer"/>

    <!-- 配置触发执行的类型以及所要执行的方法 -->

    <bean id="cancel"

      class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject">
        <ref bean="handleResWhole" />
    </property>
    <property name="targetMethod">  <!-- 要执行的方法名称 -->
        <value>executeCancel</value>
    </property>

    </bean>

    <!-- 配置取消订单触发器trigger -->
    <bean id="cancelTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean ">

    <property name="jobDetail" ref="cancel"></property>
    <property name="cronExpression" value="* * 2 * * ?"></property>

    </bean>

    <!-- 配置调度工厂 -->
    <bean id="SpringJobSchedulerFactoryBean"

      class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <!-- 取消订单的两个触发器 -->
            <ref bean="cancelTrigger"/>
            <!--<ref bean="remindTrigger" />-->
        </list>
    </property>

    </bean>

注:所配置的触发器和job类他们之间通过id来建立连接。


最后

通过这个定时器可以简单实现一些定时操作,注意这样配置的话是会在服务器启动的时候定时器就会生效,而触发的时间是按照你所设置的参数决定的(上述的value=" 2 ?"),这个配置可以查阅官方文档。如果是使用java进行配置的话可以参考一下文章:
Quartz+SpringMVC实现web定时管理任务(java)

前言

最近在学习自定义控件的绘制,今天来学习一下Android Canvas——画布的相关api。


drawXXX系列

  • canvas.drawArc——画扇形

    drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter,Paint paint)
    drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint)

通过所规定的矩形(见第一个方法的RectF),以矩形的中心点为坐标原点绘制此扇形。

startAngle 开始旋转的位置 (0°在坐标轴的三点钟方向)
sweepAngle 需要旋转多少度 (大于360,则画出一圈)
useCenter 是否使用中心点,true时起点和终点都会连接矩形的中心点;false时起点和终点会直接连接起来。
如:

RectF rectF=new RectF(200,200,400,400);
canvas.drawArc(rectF,0,270,true,paint);          //画一个扇形 角度顺时针转动

从0°开始顺时针旋转270°的扇形

  • canvas.drawCircle——绘制圆形

    drawCircle(float cx, float cy, float radius, Paint paint)

cx、cy 圆的圆心坐标
radius 圆的半径
如:

canvas.drawCircle(400,400,200,paint);

**绘制一个圆心为(400,400),半径为200的圆形。
注:当画笔设置了 StrokeWidth 时,圆的半径=内圆的半径+StrokeWidth/2**

  • canvas.drawBitmap——绘制图像

    drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint)

matrix 构建的矩阵作用于将要画出的位图
如:

Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
Matrix matrix=new Matrix();
matrix.postTranslate(100,100);
matrix.postRotate(45);
canvas.drawBitmap(bitmap,matrix,paint);
drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint)

src 规定绘制bitmap上src区域的部分图像
dst 规定绘制的区域大小(图像填满整个区域)
如:

Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
Rect src=new Rect(50,50,100,100);
Rect dst=new Rect(100,100,200,200);
canvas.drawBitmap(bitmap,src,dst,paint);

drawBitmap(Bitmap bitmap, float left, float top, Paint paint)

left 绘制的起点(左上角)距离左边的距离
top 绘制的起点(左上角)距离顶部的距离

drawBitmapMesh(Bitmap bitmap, int meshWidth, int meshHeight, float[] verts, int vertOffset, int[] colors, int colorOffset, Paint paint) 

用于网格扭曲,水波等的绘制。

  • canvas.drawColor,drawRGB,drawARGB——在整个绘制区域统一涂上指定的颜色

    canvas.drawColor(Color.GREEN);
    canvas.drawRGB(100,150,200);
    canvas.drawARGB(100,100,150,200);
    该方法一般用于给区域添加一个半透明的遮罩层。

  • canvas.drawPoint——绘制圆点

    drawPoint(float x, float y, Paint paint)
    x,y 点的坐标

注:点的大小可通过paint.setStrokeWidth(30)设置,点的形状可通过paint.setStrokeCap(Paint.Cap.ROUND)设置。

  • canvas.drawPoints——绘制一组圆点

    drawPoints(float[] pts, Paint paint)
    drawPoints(float[] pts, int offset, int count,Paint paint)
    float[] pts 绘制圆点的坐标数组(数组每相邻两位形成一个坐标)

offset 从数组的第几个位置开始计算坐标
count 需要绘制的圆点个数
如:

float[] points = {0, 0, 50, 50, 50, 100, 100, 50, 100, 100, 150, 50, 150, 100};
canvas.drawPoints(points,paint);
  • canvas.drawOval——绘制椭圆

    drawOval(float left, float top, float right, float bottom, Paint paint)
    drawOval(RectF rect, Paint paint)

4个参数分别是上下左右的边界点

  • canvas.drawLine——绘制线

    drawLine(float startX, float startY, float stopX, float stopY, Paint paint)
    startX, startY, stopX, stopY 分别是线的起点和终点坐标。

  • canvas.drawLines——绘制一组线

    drawLines(float[] pts, int offset, int count, Paint paint)
    drawLines(float[] pts, Paint paint)
    与上述的绘制一组圆点同理~

  • canvas.drawRoundRect——绘制带圆角的矩形

    drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint)
    drawRoundRect(RectF rect, float rx, float ry, Paint paint)
    与绘制矩形同理~