-
当前篇:全民 Kotlin:Java我们不一样
-
第三篇:全民 Kotlin:协程特别篇
本文章已授权鸿洋微信公众号转载
随着 Kotlin 越来越火爆,学习 Kotlin 已经成为我们必经之路
多余的话就不说了,代码是最好的老师
目录
-
集成 Kotlin
-
new 关键字
-
this 关键字
-
class 关键字
-
extends 关键字
-
volatile 关键字
-
synchronized 关键字
-
final 关键字
-
变量
-
静态常量
-
定义方法
-
重载方法
-
基本数据类型
-
比较类型
-
比较对象
-
转换符
-
数组
-
循环
-
角标循环
-
高级循环
-
判断器
-
构造函数
-
创建类
-
私有化 set 方法
-
私有化 get 方法
-
枚举
-
接口
-
匿名内部类
-
内部类
-
内部类访问外部类同名变量
-
抽象类
-
静态变量和方法
-
可变参数
-
泛型
-
构造代码块
-
静态代码块
-
方法代码块
-
三元运算符
-
权限修饰符
-
抑制代码警告
-
注解处理器
集成 Kotlin
- 需要先在项目 app 模块下的
build.gradle
文件中加入配置
apply plugin: 'kotlin-android'
android {
kotlinOptions {
jvmTarget = '1.8'
}
}
- 然后在项目根目录下的
build.gradle
文件中加入 Kotlin 插件配置
buildscript {
dependencies {
// Kotlin 插件:https://plugins.jetbrains.com/plugin/6954-kotlin
// noinspection GradleDependency
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31'
}
}
- 需要注意的是,这里以
Android Studio 4.2
为例,集成的是kotlin-gradle-plugin:1.5.31
版本是没有问题的,这个 Kotlin 插件使用的版本和当前Android Studio
版本相关,如果遇到集成失败的,需要自行修改到合适的版本。
new 关键字
- Java 的写法
Intent intent = new Intent();
- Kotlin 的写法
var intent = Intent()
this 关键字
- Java 的写法
MainActivity.this
- Kotlin 的写法
this@MainActivity
class 关键字
- Java 的写法
MainActivity.class
- Kotlin 的写法
MainActivity::class.java
extends 关键字
- Java 的写法
public class MainActivity extends AppCompatActivity {
}
- Kotlin 的写法(在 Kotlin 中被继承类必须被 open 关键字修饰)
class MainActivity : AppCompatActivity() {
}
volatile 关键字
- Java 的写法
volatile ThreadPoolManager instance
- Kotlin 的写法
@Volatile
var instance: ThreadPoolManager
synchronized 关键字
- Java 的写法
// 方法上面定义同步锁
public synchronized ThreadPoolManager getInstance() {
}
// 方法里面定义同步锁
public ThreadPoolManager getInstance() {
synchronized (ThreadPoolManager.class) {
}
}
- Kotlin 的写法
@Synchronized
fun getInstance(): ThreadPoolManager? {
}
fun getInstance(): ThreadPoolManager? {
synchronized(ThreadPoolManager::class.java, {
})
}
final 关键字
- Java 的写法
// 表示变量不可重新赋值
final String text = "";
// 表示方法不能被重写
public final void test() {
}
// 表示类不能被继承
public final class MainActivity extends AppCompatActivity {
}
- Kotlin 的写法
// 表示变量不可重新赋值
val text = ""
// 表示方法不能被重写
fun test() {
}
// 表示类不能被继承
class MainActivity : AppCompatActivity() {
}
- 需要注意的是:Kotlin 的类和方法默认是不能被继承和重写的,如果想要被继承或者重写必须要使用 open 关键字进行修饰
变量
- Java 的写法
String text = "";
- Kotlin 的写法
var text: String = ""
静态常量
- Java 的写法
public class MainActivity extends AppCompatActivity {
static final String TEXT = "";
}
- Kotlin 的写法(有两种写法,二选一即可)
class MainActivity : AppCompatActivity() {
companion object {
const val TEXT: String = ""
}
}
const val TEXT: String = ""
class MainActivity : AppCompatActivity() {
}
定义方法
- Java 的写法
public void test(String message) {
}
- Kotlin 的写法(Unit 跟 void 一样效果)
fun test(message: String): Unit {
}
// 在 Kotlin 可以省略 Unit 这种返回值
fun test(message: String) {
}
重载方法
- Java 的写法
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
- Kotlin 的写法
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
}
基本数据类型
- Java 的写法
int i = 1;
long l = 2;
boolean b = true;
float f = 0;
double d = 0;
char c = 'A';
String s = "text";
- Kotlin 的写法
var i: Int = 1
var l: Long = 2
var b: Boolean = true
var f: Float = 0F
var d: Double = 0.0
var c: Char = 'A'
var s: String = "text"
// 更简洁点可以这样,自动推导类型
var i = 1
var l = 2
var b = true
var f = 0F
var d = 0.0
var c = 'A'
var s = "text"
比较类型
- Java 的写法
if ("1" instanceof String) {
}
if (!("2" instanceof String)) {
}
- Kotlin 的写法
if ("1" is String) {
}
if ("2" !is String) {
}
比较对象
- Java 的写法
// 比较两个对象内容是否一样
if (object1.equals(object2)) {
}
if (!object3.equals(object4)) {
}
// 比较两个对象是否是同一个
if (object5 == object6) {
}
if (object7 != object8) {
}
- Kotlin 的写法
// 比较两个对象内容是否一样
if (object1 == object2) {
}
if (object3 != object4) {
}
// 比较两个对象是否是同一个
if (object5 === object6) {
}
if (object7 !== object8) {
}
- 需要注意的是:Kotlin 中
==
和 Java 中的equals
效果是一样的,而 Kotlin 中===
和Java
中==
的效果是一样的。
转换符
- Java 的写法
int number = 100;
System.out.println(String.format("商品数量有%d", number));
- Kotlin 的写法
var number = 100
println("商品数量有${number}")
// 换种简洁的写法
var number = 100
println("商品数量有$number")
// 如果不想字符串被转义可以使用\$
var number = 100
println("商品数量有\$number")
数组
- Java 的写法
int[] array1 = {1, 2, 3};
float[] array2 = {1f, 2f, 3f};
String[] array3 = {"1", "2", "3"};
- Kotlin 的写法
val array1 = intArrayOf(1, 2, 3)
val array2 = floatArrayOf(1f, 2f, 3f)
val array3 = arrayListOf("1", "2", "3")
循环
- Java 的写法
String[] array = {"1", "2", "3"};
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
- Kotlin 的写法
val array = arrayListOf("1", "2", "3")
for (i in array.indices) {
println(array[i])
}
角标循环
- Java 的写法
String[] array = {"1", "2", "3"};
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
- Kotlin 的写法(这种写法在 Kotlin 中称之为区间)
val array = arrayListOf("1", "2", "3")
for (i in IntRange(0, array.size - 1)) {
println(array[i])
}
// 换种更简洁的写法
val array = arrayListOf("1", "2", "3")
for (i in 0..array.size - 1) {
println(array[i])
}
// 编译器提示要我们换种写法
val array = arrayListOf("1", "2", "3")
for (i in 0 until array.size) {
println(array[i])
}
高级循环
- Java 的写法
String[] array = {"1", "2", "3"};
for (String text: array) {
System.out.println(text);
}
- Kotlin 的写法
val array = arrayListOf("1", "2", "3")
for (text in array) {
println(text)
}
判断器
- Java 的写法
int count = 1;
switch (count) {
case 0:
System.out.println(count);
break;
case 1:
case 2:
case 3:
System.out.println(count);
break;
case 5:
case 7:
System.out.println(count);
break;
default:
System.out.println(count);
break;
}
- Kotlin 的写法
val count = 1
when (count) {
0 -> {
println(count)
}
in 1..3 -> {
println(count)
}
5, 7 -> {
println(count)
}
else -> {
println(count)
}
}
// 换种更简洁的写法
val count = 1
when (count) {
0 -> println(count)
in 1..3 -> println(count)
5, 7 -> println(count)
else -> println(count)
}
构造函数
- Java 的写法
public class MyView extends View {
public MyView(Context context) {
this(context, null);
}
public MyView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
}
- Kotlin 的写法
// 第一种写法
class MyView : View {
constructor(context: Context) : this(context, null) {
}
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0) {
}
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
}
}
// 第二种写法
class MyView : View {
constructor(context: Context) : this(context, null)
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
init {
}
}
// 第三种写法
class RegexEditText @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
init {
}
}
// 如果只有一种构造函数的还可以这样写
class MyView(context: Context) : View(context) {
init {
}
}
创建类
- Java 的写法
public class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Person person = new Person("Android轮子哥", 100);
person.setName("HJQ");
person.setAge(50);
System.out.println("name: " + person.getName() + ", age: " + person.getAge());
- Kotlin 的写法(如果不想暴露成员变量的set方法,可以将 var 改成 val )
class Person {
var name: String? = null
get() = field
set(value) {field = value}
var age: Int = 0
get() = field
set(value) {field = value}
}
// 换种更简洁的写法
class Person(var name: String, var age: Int)
var person = Person("Android轮子哥", 100)
person.name = "HJQ"
person.age = 50
println("name: {$person.name}, age: {$person.age}")
私有化 set 方法
- Java 的写法
public class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
private void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
private void setAge(int age) {
this.age = age;
}
}
- Kotlin 的写法
class Person {
var name: String? = null
private set
var age: Int = 0
private set
}
私有化 get 方法
- Java 的写法
public class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
private String getName() {
return name;
}
private void setName(String name) {
this.name = name;
}
private int getAge() {
return age;
}
private void setAge(int age) {
this.age = age;
}
}
- Kotlin 的写法
class Person {
private var name: String? = null
private var age: Int = 0
}
枚举
- Java 的写法
enum Sex {
MAN(1), WOMAN(2);
Sex(int type) {}
}
- Kotlin 的写法
enum class Sex (var type: Int) {
MAN(1), WOMAN(2)
}
接口
- Java 的写法
public interface Callback {
void onSuccess();
// JDK 8 新特性,接口方法支持默认实现
default void onFail() {
}
}
- Kotlin 的写法
interface Callback {
fun onSuccess()
fun onFail() {
}
}
匿名内部类
- Java 的写法
post(new Runnable() {
@Override
public void run() {
}
});
- Kotlin 的写法
post(object : Runnable {
override fun run() {
}
})
内部类
- Java 的写法
public class MainActivity extends AppCompatActivity {
public class MyTask {
}
}
- Kotlin 的写法
class MainActivity : AppCompatActivity() {
inner class MyTask {
}
}
内部类访问外部类同名变量
- Java 的写法
String name = "Android轮子哥";
public class MyTask {
String name = "HJQ";
public void show() {
System.out.println(name + "---" + MainActivity.this.name);
}
}
- Kotlin 的写法
var name = "Android轮子哥"
inner class MyTask {
var name = "HJQ"
fun show() {
println(name + "---" + this@MainActivity.name)
}
}
抽象类
- Java 的写法
public abstract class BaseActivity extends AppCompatActivity implements Runnable {
abstract void init();
}
- Kotlin 的写法
abstract class BaseActivity : AppCompatActivity(), Runnable {
abstract fun init()
}
静态变量和方法
- Java 的写法
public class ToastUtils {
public static Toast toast;
public static void show() {
toast.show();
}
}
- Kotlin 的写法(在 Kotlin 将这种方式称之为伴生对象)
companion object ToastUtils {
var toast: Toast? = null
fun show() {
toast?.show()
}
}
可变参数
- Java 的写法
public int add(int... array) {
int count = 0;
for (int i: array) {
count += i;
}
return count;
}
- Kotlin 的写法
fun add(vararg array: Int): Int {
var count = 0
//for (i in array) {
// count += i
//}
array.forEach {
count += it
}
return count
}
泛型
- Java 的写法
public class Bean<T extends String> {
T data;
public Bean(T t) {
this.data = t;
}
}
Bean<String> bean = new Bean<>("666666");
- Kotlin 的写法
class Bean<T : Comparable<String>>(t: T) {
var data = t
}
var bean = Bean<String>("666666")
// 换种更简洁的写法
var bean = Bean("666666")
构造代码块
- Java 的写法
public class MainActivity extends AppCompatActivity {
int number;
{
number = 1;
}
}
- Kotlin 的写法
class MainActivity : AppCompatActivity() {
var number = 0
init {
number = 1
}
}
静态代码块
- Java 的写法
public class MainActivity extends AppCompatActivity {
static int number;
static {
number = 1;
}
}
- Kotlin 的写法
class MainActivity : AppCompatActivity() {
companion object {
var number = 0
init {
number = 1
}
}
}
方法代码块
- Java 的写法
void test(){
{
int a = 1;
}
}
- Kotlin 的写法
fun test() {
run {
var a =1
}
}
三元运算符
- Java 的写法
int c = a > b ? a : b;
- Kotlin 的写法
var c = if (a > b) a else b
权限修饰符
- Java 的写法(默认为
default
)
修饰符 | 作用 |
---|---|
public | 所有类可见 |
protected | 子类可见 |
default | 同一包下的类可见 |
private | 仅对自己类可见 |
- Kotlin 的写法(默认为
public
)
修饰符 | 作用 |
---|---|
public | 所有类可见 |
internal | 同 module 下的类可见 |
protected | 子类可见 |
private | 仅对自己类可见 |
抑制代码警告
- Java 的写法
@SuppressWarnings("unused")
@SuppressLint("ClickableViewAccessibility")
- Kotlin 的写法
@Suppress("unused")
@Suppress("ClickableViewAccessibility")
注解处理器
- Java 的写法
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
- Kotlin 的写法
apply plugin : 'kotlin-kapt'
kapt 'com.github.bumptech.glide:compiler:4.12.0'
- 如果在 Kotlin 仍然使用 annotationProcessor 来集成注解处理器,那么会导致报错编译不过去