Kotlin-简约之美-进阶篇(十八)(与Java的较量)


文章目录

      • 数据实体类
      • 接口变量
      • 懒汉式单例
      • 构造方法
            • 情况1
            • 情况2
      • lambda的应用
            • 无参数
            • 有参数加法
            • 作为函数参数
      • 匿名函数
      • 闭包
      • 学习交流

在Java当中一些常量通常情况下都是定义在接口当中,默认情况下所有的成员变量都是public static final类型的,所有的方法都是public abstract类型的,而在Kotlin中的接口是不允许定义常量的,但是我们可以通过伴生对象companion object来解决这个问题。
数据实体类
  • Java中的实现
public class NewsType { public int id; public String typename; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTypename() { return typename; } public void setTypename(String typename) { this.typename = typename; }

  • Kotlin中的实现
class NewsType { var id: Int = 0 var typename: String? = null var addtime: String? = null }

接口变量
  • Java中的定义:
public interface NewsDBConfig { String DB_NAME = "fly_news.db"; int VERSION_CODE = 1; interface NewsType { String TABLE_NAME = "news_type"; String CLUMN_ID = "id"; String CLUMN_TYPE_NAME = "typename"; String CLUMN_ADD_TIME = "addtime"; String CREATE_TABLE = "create table " + TABLE_NAME + " ("+CLUMN_ID+" integer PRIMARY KEY autoincrement," + CLUMN_TYPE_NAME + " varchar(64),"+CLUMN_ADD_TIME+" datetime default (datetime('now','localtime')))"; } }

  • Kotlin中的定义
interface NewsDBConfig {interface NewsType { companion object { val TABLE_NAME = "news_type" val CLUMN_ID = "id" val CLUMN_TYPE_NAME = "typename" val CLUMN_ADD_TIME = "addtime" val CREATE_TABLE = "create table $TABLE_NAME ($CLUMN_ID integer PRIMARY KEY autoincrement,$CLUMN_TYPE_NAME varchar(64),$CLUMN_ADD_TIME datetime default (datetime('now','localtime')))" } } companion object { val DB_NAME = "fly_news.db" val VERSION_CODE = 1 } }

懒汉式单例
  • Java中的实现
public class NewsDBHelper extends SQLiteOpenHelper { private static NewsDBHelper mNewsDBHelper; public static NewsDBHelper getInstance(Context context) { if (mNewsDBHelper == null) { synchronized (NewsDBHelper.class) { mNewsDBHelper = new NewsDBHelper(context); } } return mNewsDBHelper; }private NewsDBHelper(Context context) { super(context, NewsDBConfig.DB_NAME, null, NewsDBConfig.VERSION_CODE); } }

  • Kotlin中的实现
class NewsDBHelper private constructor(context: Context) : SQLiteOpenHelper(context, NewsDBConfig.DB_NAME, null, NewsDBConfig.VERSION_CODE) {companion object { private var mNewsDBHelper: NewsDBHelper? = null fun getInstance(context: Context): NewsDBHelper? { if (mNewsDBHelper == null) { synchronized(NewsDBHelper::class.java) { if (mNewsDBHelper == null) { mNewsDBHelper = NewsDBHelper(context) } } } return mNewsDBHelper } } }

构造方法
情况1
  • Java中的实现
public class MyView extends View { public MyView(Context context) { super(context); }public MyView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); }public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } }

  • Kotlin中的实现
class MyView : View { constructor(context: Context) : super(context) {}constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {}constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context,attrs,defStyleAttr) {} }

情况2
  • java中的实现
public class MyView1 extends View { public MyView1(Context context) { this(context,null); }public MyView1(Context context, @Nullable AttributeSet attrs) { this(context, attrs,0); }public MyView1(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } }

  • Kotlin中的实现
class MyView1 @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : View(context, attrs, defStyleAttr)

或者
class MyView2 : View { @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : super(context, attrs, defStyleAttr) {}

lambda的应用
无参数
  1. 常规写法
fun print() { println("HelloWorld") }

  1. lambda标准写法
var print1: () -> Unit = {println("HelloWorld1")}

  1. lambda简写
var print2 = {println("HelloWorld2")}

有参数加法
  1. 常规写法
fun add(x: Int, y: Int): Int { return x + y }

  1. lambda标准写法
var add1: (Int, Int) -> Int = { x, y -> x + y }

  1. lambda简写
var add2 = { x: Int, y: Int -> x + y }

作为函数参数
  1. 一般写法
fun add3(x: Int, y: Int): Int {return x * y} fun add4(a: Int, b: Int): Int {return a + b} //调用 var result = add4(1, add3(2, 3))

  1. lambda写法
fun add5(x:Int,add6:(Int,Int)->Int):Int{ return x + add6.invoke(2,3) } //调用 var result5 = add5(1,{x:Int,y:Int -> x*y})

  1. lambda写法
fun add7(x:Int,add8:(Int)->Boolean):Int{ if(add8(x)){ return x }else{ return 0 } } //调用1 var add81 = add7(10,{x:Int -> x > 0}) //调用2 var add82 = add7(10,{it > 0})

匿名函数
  1. 标准写法
fun add(x: Int, y: Int): Int { return x + y }

或者
fun add1(x: Int, y: Int): Int = x + y

  1. 匿名写法
var add2 = fun(x: Int, y: Int): Int { return x + y }

  1. 匿名写法
var add3 = fun(x: Int, y: Int): Int = x + y

闭包
1.函数嵌套
fun test1() { println("test1") fun test2() { println("test2") } }

2.函数作为返回值
fun test2(x: Int): () -> Int { var a = 0 return fun(): Int { a++ return a + x } } //调用 var test = test2(10) println(test()) println(test()) println(test())

【Kotlin-简约之美-进阶篇(十八)(与Java的较量)】3.函数作为返回值
fun test3(v: Int): (Int, Int) -> Int { var a = 1 var b = 2 return { x, y -> x + y + a + b + v} } //调用 var test2 =test3(10) var result = test2(12,1) println(result)

学习交流
欢迎入群交流学习,Android、Java开发技术交流群
  • QQ群:810970432
  • email:geduo_83@163.com
    Kotlin-简约之美-进阶篇(十八)(与Java的较量)
    文章图片

    推荐阅读