Kotlin的一些基础使用以及在android studio使用与java的不同

来源:互联网 发布:网络大电影怎么发行 编辑:程序博客网 时间:2024/06/03 18:07

var表示标量

val 表示常量

var a:type?  type?代表a可空标识

Java在结尾时用;结尾而kotlin什么都不用,结尾不用写任何东西

Array<String>表示String[]

var name:type=1; 表示类型为type的变量name

var name=1;自动推导类型

var name:type;在没有赋初始值时必须声明类型

$后可以跟一个变量名称

 

b!!操作符(b!!会返回一个非空的b或者抛出一个b为空的NPENullPointException空指针异常))

val l=b!!.length()

 

val i=10

val s=”i=$i”  识别为i=10

Val s=”abc”

Var str=”$s.length is ${s.length}” //识别为abc.length=3

fun aobjAny):c{

ifobj is String{}

}

 

If流程控制

val max=if(a>b) a else b

 

if分支可以表示块,最后一个表达是该块的值

val max=if(a>b){

print(“dsaasdasdsa”)

a

}

Else{

print(“sdsdsdsds”)

b

}

 

when 表达式取代了switch

When(x){

0,1 -> print(“sdsdfdfsdfdsf”);//x01中的一个执行此步

2 -> print(“sdsdfdfsdfdsf”);//x2执行此步

else -> print(“sdsdfdfsdfdsf”);//其他执行此步

 

 

}

 

使用Java类

val intent = Intent(this, MainActivity::class.java)

类名::class.java没有为什么就这么写记着就是没有new直接调用构造方法

 

代表函数afun为一个函数的声明,c为函数返回值类型,如果cUnit则代表返回为空,可以省略不写,obj为任意(Any)类型

可以用is检查obj的类型

for(int i=0;i<mFirstFragments.size();i++

){
    mFirstFragments.get(position).setPosition(position);
}

==for (i inmFirstFragments!!.indices)

{
    mFirstFragments!![position].setPosition(position)
}

 

mTabLayout= (TabLayout) findViewById(R.id.tab_title);

==mTabLayout = findViewById(R.id.tab_title)asTabLayout类型转换的不同

 

 

switch (position){
    case 0://要闻http://inews.ifeng.com/50977577/news.shtml
        
url=url.append("http://inews.ifeng.com/").append(num).append("/news.shtml");

        break;

    case 1://财经
        
url=url.append("http://ifinance.ifeng.com/").append(num).append("/news.shtml");

        break;

    case 2://体育
        
url=url.append("http://isports.ifeng.com/").append(num).append("/news.shtml");

        break;
    case 3://军事
        
url=url.append("http://imil.ifeng.com/").append(num).append("/news.shtml");

        break;
    case 4://科技
        
url=url.append("http://itech.ifeng.com/").append(num).append("/news.shtml");

        break;
    case 5://历史
        
url=url.append("http://ihistory.ifeng.com/").append(num).append("/news.shtml");

        break;
    case 6://娱乐http://ifenghuanghao.ifeng.com/13263804/news.shtml
        
url=url.append("http://ifenghuanghao.ifeng.com/").append(num).append("/news.shtml");

        break;

}

而在kotlin

when (position) {
    0//要闻http://inews.ifeng.com/50977577/news.shtml
    
-> url = url.append("http://inews.ifeng.com/").append(num).append("/news.shtml")

    1//财经
    
-> url = url.append("http://ifinance.ifeng.com/").append(num).append("/news.shtml")

    2//体育
    
-> url = url.append("http://isports.ifeng.com/").append(num).append("/news.shtml")
    3//军事
    
-> url = url.append("http://imil.ifeng.com/").append(num).append("/news.shtml")
    4//科技
    
-> url = url.append("http://itech.ifeng.com/").append(num).append("/news.shtml")
    5//历史
    
-> url = url.append("http://ihistory.ifeng.com/").append(num).append("/news.shtml")
    6//娱乐http://ifenghuanghao.ifeng.com/13263804/news.shtml
    
-> url = url.append("http://ifenghuanghao.ifeng.com/").append(num).append("/news.shtml")
}

 

 

内部类的表示

 

class webViewClient extends WebViewClient {}

 

nternal inner class webViewClient : WebViewClient() {}

 

 

内部类和参数默认为public

类默认为不可继承(final),想要可被继承要声明为openabstract
取消了static关键字,静态方法和参数统一写在companion object
internal模块内可见,inner内部类

 

空判断

Kotlin的空安全设计对于声明可为空的参数,在使用时要进行空判断处理,有两种处理方式一种像Java一样抛出空异常,字段后加!!,另一种不做处理直接跳过,字段后加?

 

//类型后面加?表示可为空var age: String? ="23" //抛出空指针异常val ageInt = age!!.toInt()//不做处理跳过val ages = age?.toInt()

关键字(尽量补全)

by as lazy init downTo
声明:open override fun inline inner internal data companion object lateinit var val
判断:when in is
运算:and or

 

类型

Any Unit
基本类型:Boolean Byte Short Int Long Float Double Char

val list = ArrayList<String>()//递增for (int i = 0; i < list.size(); i++)for (i in list.indices) {

   print(list[i])

}//递增for (int i = 2; i < list.size(); i++)for (i in2..list.size-1) {

   print(list[i])

}//递减for (int i = list.size(); i >= 0; i--)for (i in list.size downTo 0) {

    print(list[i])

}//操作列表内的对象for (item in list) {

    print(item)

}//加强版for((i, item) in list.witnIndex()) {

    print(list[i])

    print(item)

}//变种版

list.forEach {

    print(it)

}

 

list.forEach {

    print(it)

}

 

list.forEachIndexed { i, s ->

    print(list[i])

    print(s)

}

 

list.forEachIndexed(object :(Int,String) -> Unit{

    override funinvoke(i: Int, s: String){

        print(list[i])

        print(s)

    }

})

 

val x =7

when (x) {

  in 1..10 -> print("x is in the range")

  in validNumbers -> print("x is valid")

  !in10..20 -> print("x is outside the range")

  else -> print("none of the above")

}

Kotlin中常量用val声明,变了用var声明,关键字在前面,类型以冒号:隔开在后面,也可以省略直接赋值,类型后带问号?表示可为空类型(默认空安全)。
常量val延迟加载by lazy{},默认线程安全关闭线程安全lazy(LazyThreadSafetyMode.NONE){},变量var延迟加载lateinit

//常量数组int[][][] arrs = new int[3][2][1];

val arrs = Array(3) { Array(2) { IntArray(1) } }//空安全变量

var str: String ="hello"//可为空字符串变量

var str1: String? =null

 

Android项目中使用Kotlin

1. 安装Kotlit插件

Android Studio 默认没有装Kotlin插件File/Setting/Plugins/Install JetBrains plugin搜索Kotlin点击Install安装,Kotlin Extensions For Android已经过时废弃了。接下来只需要简单的配置就可在项目中使用Kotlin和Java同时开发了。

2. 使用Kotlin

项目gradle加入编译脚本

buildscript {

    ext.kotlin_version ='1.0.3'

    repositories {

        jcenter()

    }

    dependencies {

        classpath 'com.android.tools.build:gradle:2.1.3'

        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

    }

}

当前工程gradle加入引用

apply plugin:'kotlin-android'

//...

android {

 

    sourceSets {

        //添加一个源码文件夹

        main.java.srcDirs +='src/main/kotlin'

    }

}dependencies {

    compile fileTree(include: ['*.jar'], dir:'libs')

    testCompile'junit:junit:4.12'

 

    //Kotlin

    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

  //...

}

以上操作其实只需要在Tools->Kotlin->Configure Kotlin in Project即可自动配置

3. 使用Kotlin的Android扩展插件

kotlin-android-extensions使用这个插件,再需要调用findViewById,XML布局定义的控件,会自动生成引用,对于我们来说现在布局文件就是一个属性

加入编译脚本(避免误人子弟这个版本已经很旧了,版本号自行修改)

buildscript {

    ext.kotlin_version ='1.0.3'

    repositories {

        jcenter()

    }

    dependencies {

        classpath 'com.android.tools.build:gradle:2.1.3'

        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"

 

    }

}

加入引用

apply plugin:'kotlin-android'

apply plugin:'kotlin-android-extensions'

//...

dependencies {

    compile fileTree(include: ['*.jar'], dir:'libs')

    testCompile'junit:junit:4.12'

 

    //Kotlin

    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

    //...

}

另外还可使用AnkoAnko目的是用代码来代替XML生成布局,加入引用即可

apply plugin:'kotlin-android'

apply plugin:'kotlin-android-extensions'

//...

dependencies {

    compile fileTree(include: ['*.jar'], dir:'libs')

    testCompile'junit:junit:4.12'

 

    //...

 

    // Anko

    compile 'org.jetbrains.anko:anko-sdk15:0.8.2' // sdk19, sdk21, sdk23 are also available

    compile 'org.jetbrains.anko:anko-support-v4:0.8.2' // In case you need support-v4 bindings

    compile 'org.jetbrains.anko:anko-appcompat-v7:0.8.2' // For appcompat-v7 bindings

}

MutableList<Data>代表List<Data>表示可变List


二维数组初始化

private var mPoint :Array<Array<Point?>> =Array(3){Array<Point ?>(3,{null})}


阅读全文
0 0
原创粉丝点击