var User: User? = null
// 无法编译,因为User可能是null,我们需要进行处理
artist.print()
// 只有在User != null时才会打印
User?.print()
// 如果我们在之前进行了空检查,则不需要使用安全调用操作符调用
if (User != null) {
User.print()
}
// 只有在确保User不是null的情况下才能这么调用,否则它会抛出异常
User!!.print()
// 使用Elvis操作符来给定一个在是null的情况下的替代值
val name = User?.name ?: “empty”
就比如这段代码,如果user是可能为空的,而user没对空情况做处理,则无法编译。
我们再举个实际的例子:
Java
public void test(String string)
{
if (string != null){
char[]chars = string.toCharArray();
if (chars.length>10){
System.out.println(((Character)chars[10]).hashCode());
}
}
}
Kotlin
fun testNullSafeOperator(string:String?){
System.out.println(string?.toCharArray()?.getOrNull(10)?.hashCode());
}
testNullSafeOperator(null)
testNullSafeOperator(“15659766728”)
testNullSafeOperator(“158”)
//result
null
49
null
一眼可以看出,相对于Java繁琐的判断而言,Kotlin几乎是一行代码解决问题的。
易拓展性
易拓展性就是说在Kotlin中,我们可以给任何类添加函数和方法,包括系统类以及自定义的类,这样会使得我们比项目中原本拥有的典型的工具类来的更加具有可读性。比如,我们想要在User类中添加一个toast方法:
Java
public static void toast(User user,String message){
Toast.makeText(user,message,Toast.LENGTH_LONG).show();
}
Kotlin
fun User.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(this, message, duration).show()
}
User.toast(“Hello world!”)
当我们加上这段代码之后,就可以在所有用得到User的地方调用User.toast()方法。即我们只需要重写扩展方法就可以了,不过需要注意的是,如果拓展方法写到类中,只能在该类生效。
函数式
Kotlin是一种基于面向对象的语言,但是就如其他很多现代的语言一样,它使用了很多函数式编程的概念,比如使用lambda表达式来更方便地解决问题。
我们来举个简单的例子:
大家对于Android开发中经常会使用到的点击事件应该并不陌生,之前我们是这样来写的
view.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), “Click”, Toast.LENGTH_SHORT).show();
}
})
利用刚才我们所学习到的Kotlin语言的拓展性,我们可以改写成如下形式
view.setOnClickListener(object : OnClickListener {
override fun onClick(v: View) {
toast(“Click”)
}
}
而利用lambdas表达式我们就可以把上述代码再次优化
view.setOnClickListener({view -> toast(“Click”)})
考虑到很多情况下我们并不需要用到参数View,所以左值参数也可以省略,考虑到只有一个参数,可以将大括号去除,于是就有了
view.setOnClickListener{toast(“Click”)}
比起最初的Java代码简化了差不多五倍以上,是不是很简洁,而且也特别容易理解。
Kotlin Android Extention
这个对于每一个Android应用程序开发者来说算得上是最大的福利了。也是强势推荐使用Kotlin语言来开发Android项目的重要原因。为什么这么说呢?在以往的Android开发中,大家应该都能够明显发现findViewById()是一个比较让人抓狂的函数,尽管开源界已经有几个库提供了解决办法,比如:ButterKnife,DataBinding等,但我们还是被困在这个findViewById这个让人又爱又恨的函数中。而Kotlin则是提供了一个解决该问题最简单的方法——Kotlin Android Extensions。
Kotlin Android Extensions是Kotlin的一个插件,它包含在普通的那个插件中,允许以惊人的无缝方式从Activitie,Fragment和View中恢复View,不用增加额外的代码,直接使用xml中定义的android:id就可以引用view,就像它们是在布局中定义的属性一样,你可以使用 id 的名称。除此以外它还构建本地视图缓存,因此当我们首次使用一个属性时,它会做一个普通的findViewById,而接下来,View则是从缓存中恢复,使得访问速度更快。
举个例子:
这是一个布局文件
<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout
xmlns:android=“http://schemas.android.com/apk/res/android”
android:layout_width=“match_parent”
android:layout_height=“match_parent”>
<TextView android:id=“@+id/message”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”/>
</android.support.constraint.ConstraintLayout>
下面我们用两种方式写MainActivity。
- 使用基于Kotlin语言的findViewById()方法
class MainActivity : AppCompatActivity() {
private var mTextMessage: TextView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mTextMessage = findViewById(R.id.message) as TextView
mTextMessage!!.setText(“Hello jingsi”)
}
- 利用Kotlin Android Extention插件
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
private var mTextMessage: TextView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
message.setText(“Hello jingsi”);
}
具体配置方法可参考:Kotlin编程之Kotlin Android Extensions(扩展插件)
如何在Android Studio编译器下配置Kotlin开发环境
了解到一些基础的Kotlin语言的语法和特性后,那么我们该如何在Android Studio中使用Kotlin呢?
- 首先我们需要下载Kotlin插件(以Android Studio 3.1.2版本为例)
点击File->Settings->Plugins 可以在已支持的插件中找到Kotlin(貌似Android Studio 3.1.2版本 是自带Kotlin插件的)
如果使用的是老版本的Android Studio没有该插件 那么点击Install JetBrains plugins 然后在搜索栏中输入Kotlin进行搜索找到Kotlin 点击右边的Install按钮 下载完成后 Restart Android Studio即可
重新打开Android Studio后点击File->New 可以看到新出现的Kotlin File/Class按钮,然后点击(本来应该还有个Kotlin Activity,奈何找了很多办法也没有显示出来 好在影响不大)
- 然后新建Kotlin Class后会看到上方有个提示配置信息 点击Configure 进行Kotlin版本配置
点击OK,然后你会发现Android Studio自动打开了build.gradle文件,并且在头部多出了一行Kotlin的配置代码,build.gradle文件有变动,我们重新编译下项目,这时因为需要下载kotlin的相关文件,所以可能需要些时间.然后会发现project的build.gradle有了一些变化:
buildscript {
ext.kotlin_version = ‘1.2.50’
repositories {
google()
jcenter()
}
dependencies {
classpath ‘com.android.tools.build:gradle:3.1.2’
classpath “org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version”
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
然后是Module下的build.gradle:
apply plugin: ‘com.android.application’
apply plugin: ‘kotlin-android’
apply plugin: ‘kotlin-android-extensions’
android {
compileSdkVersion 27
defaultConfig {
applicationId “com.example.lcjingsi.kotlindemo”
minSdkVersion 15
targetSdkVersion 27
versionCode 1
versionName “1.0”
testInstrumentationRunner “android.support.test.runner.AndroidJUnitRunner”
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}
}
}
sourceSets {
main.java.srcDirs += ‘src/main/kotlin’
}
dependencies {
implementation fileTree(dir: ‘libs’, include: [‘*.jar’])
implementation ‘com.android.support:appcompat-v7:27.1.1’
implementation ‘com.android.support.constraint:constraint-layout:1.1.2’
testImplementation ‘junit:junit:4.12’
androidTestImplementation ‘com.android.support.test🏃1.0.2’
androidTestImplementation ‘com.android.support.test.espresso:espresso-core:3.0.2’
compile “org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version”
}
repositories {
mavenCentral()
}
下面我们用个简单的Demo来演示一下:
在开始写之前,我们在利用Kotlin的Kotlin-android-extensions插件的实用性,使得我们不用再写findViewById()代码配置很简单,首先在moudle的build.gradle文件头部加上这行代码:apply plugin: 'kotlin-android-extensions
这个时候我们需要重新编译下项目,然后打开MainActivity,在导包配置中,添加如下代码import kotlinx.android.synthetic.main.activity_main.*
然后就可以编写代码了。
下面是activity_main.xml文件
<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:app=“http://schemas.android.com/apk/res-auto”
xmlns:tools=“http://schemas.android.com/tools”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
文末
我总结了一些Android核心知识点,以及一些最新的大厂面试题、知识脑图和视频资料解析。
以后的路也希望我们能一起走下去。(谢谢大家一直以来的支持)
部分资料一览:
- 330页PDF Android学习核心笔记(内含8大板块)
-
Android学习的系统对应视频
-
Android进阶的系统对应学习资料
- Android BAT大厂面试题(有解析)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
能一起走下去。(谢谢大家一直以来的支持)
部分资料一览:
- 330页PDF Android学习核心笔记(内含8大板块)
[外链图片转存中…(img-WCdj7L2R-1714712753592)]
[外链图片转存中…(img-3WWEeemI-1714712753592)]
-
Android学习的系统对应视频
-
Android进阶的系统对应学习资料
[外链图片转存中…(img-A6u4TiAo-1714712753593)]
- Android BAT大厂面试题(有解析)
[外链图片转存中…(img-EL8Sqk5u-1714712753593)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!