Kotlin 与 Java基本语法对比

2025-05-29 0 46

KotlinJava基本语法对比

KotlinJava更年轻,但它是一个非常有前途的编程语言,它的社区不断增长。 每个人都在谈论它,并说它很酷。 但为什么这么特别?

我们准备了一系列文章,分享我们在Kotlin开发Android应用程序的经验。 我们将讨论KotlinJava在语法,可用性,UI性能和异步性方面的区别,以便您可以决定哪种语言最适合您。

让我们从一些基本的语法差异开始。 这是第一个:

1. 使用Kotlin,你可以用更少的代码做更多

Kotlin的一个主要优点是它的简洁。 你用更少的代码获得更多的功能。 而你写的代码越少,你犯的错误就越少。 这很简单。 让

我们看看Kotlin的基础知识,从类开始。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70
public final class Person {

private String name;

private int age;

private float height;

public Person(String name, int age, float height) {

this.name = name;

this.age = age;

this.height = height;

}

public Person(String name, int age) {

this.name = name;

this.age = age;

this.height = 1.8f;

}

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;

}

public float getHeight() {

return height;

}

public void setHeight(float height) {

this.height = height;

}

@Override

public String toString() {

return "Person{" +

"name='" + name + '\\'' +

", age=" + age +

", height=" + height +

'}';

}

@Override

public boolean equals(Object o) {

if (this == o) return true;

if (o == null || getClass() != o.getClass()) return false;

Person person = (Person) o;

if (age != person.age) return false;

if (Float.compare(person.height, height) != 0) return false;

return name != null ? name.equals(person.name) : person.name == null

}

@Override

public int hashCode() {

int result = name != null ? name.hashCode() : 0;

result = 31 * result + age;

result = 31 * result + (height != +0.0f ? Float.floatToIntBits(height) : 0);

return result;

}

}

上面是一个通常的Java类。 它做的不多。 它只包含一些数据。 但是,当你意识到它给表带来的不足时,看看这段代码有多大是很痛苦的。 为了鼓励你,我们会给你一个等同的类写在Kotlin

?

1

2

3
data class Person(var name: String,

var age: Int,

var height: Float = 1.8f)

是的,你会为你的数据类自动获取需要的getters,setters,equals(),hashcode(),toString()和copy()函数! 当然,你可以轻松地重写这些函数,但在大多数情况下,只需声明类及其属性就足够了。

这正是我们的意思,当我们说Kotlin简洁。

2. 你可以避免 NullPointerException

现在我们想提醒你在许多编程语言中最大的痛苦 – 空指针异常。 我们几乎不能想象自从托尼·霍尔在1965年发明它之后,有多少开发者遭受了空指针,同时试图使事情更简单一些。

可悲的是,我们不能及时回来,防止Tony犯这个错误。 但是使用Kotlin,我们现在可以轻松地转义NullPointerException。

?

1

2

3
val person: Person? = null

...

person?.name = "John"

如果变量是可空的,编译器将不允许你访问它没有适当的检查。 Kotlin强迫你使用? 运算符。 这可以防止应用程序自动崩溃。
它如何在引擎盖下工作? 让我们回顾一下生成的字节码。

?

1

2

3

4

5

6

7

8

9

10
L2

LINENUMBER 18 L2

ALOAD 3

DUP

IFNULL L3

LDC "John"

INVOKEVIRTUAL igalata/com/kotlinexample/Person.setName (Ljava/lang/String;)V

GOTO L4

L3

POP

正如你所看到的,我们在这里有相同的空检查。 JetBrains的开发人员(创建Kotlin)知道每次检查我们的变量是避免NullPointerException的唯一方法。 但他们也知道Android开发人员不想在他们的项目中处理NullPointerException。 他们可能想:“为什么不自动生成这个检查如果变量是可空的?

JetBrains的开发人员只是这样,让我们的生活更容易了!

3. 你可以摆脱util类

让我们来讨论一下有关使用util类的丑陋事情。 你有没有一个项目没有他们? 我们几乎不记得这一切。 Kotlin有一个聪明的解决方案 – 扩展功能 – 帮助你摆脱所有的util类一劳永逸。

扩展函数几乎是一个通常的Kotlin函数。 但是当你声明它,你需要指定的实例将具有扩展功能的类。
fun Context.toast(text: String) = Toast.makeText(this, text, Toast.LENGTH_SHORT).show()

注意'this',我们作为参数传递给makeText()方法? 它不是类的一个实例,我们声明这个函数,而是一个Context实例。 现在你可以直接从你的Activity或任何其他Context实例调用这个函数。 例如:

?

1
toast("Hi")

你应该记住,扩展函数不以任何方式修改它扩展的类。 那么它如何工作而不改变原来的类? 让我们再次看到字节码。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27
public final toast(Landroid/content/Context;Ljava/lang/String;)V

@Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0

@Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 1

L0

ALOAD 1

LDC "$receiver"

INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull (Ljava/lang/Object;Ljava/lang/String;)V

ALOAD 2

LDC "text"

INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull (Ljava/lang/Object;Ljava/lang/String;)V

L1

LINENUMBER 31 L1

ALOAD 1

ALOAD 2

CHECKCAST java/lang/CharSequence

ICONST_0

INVOKESTATIC android/widget/Toast.makeText (Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;

INVOKEVIRTUAL android/widget/Toast.show ()V

L2

LINENUMBER 32 L2

RETURN

L3

LOCALVARIABLE this Ligalata/com/kotlinexample/MainActivity; L0 L3 0

LOCALVARIABLE $receiver Landroid/content/Context; L0 L3 1

LOCALVARIABLE text Ljava/lang/String; L0 L3 2

MAXSTACK = 3

MAXLOCALS = 3

哈! 您的函数隐式接收它作为第一个参数扩展的类的实例。 因此,在字节码中,对函数体中“this”的任何访问都将替换为对第一个参数的访问。 没有魔法真的。 您可以在项目的任何位置使用此函数。

时间删除你的util包!

4. 你可以忘记视图绑定

你还记得findViewById()method()吗? 我们相信你不喜欢它。 我们也不是。 此外,我们不想为我们需要访问的每个视图声明变量和Butterknife注释。

你可以忘记与Kotlin Android Extensions的视图绑定。 不再需要创建变量和绑定视图。 您可以使用在xml布局中声明的标识符直接访问您的视图。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26
public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button button = (Button) findViewById(R.id.button);

final TextView text = (TextView) findViewById(R.id.text);

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

text.setText("You've clicked a button");

}

});

}

}

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {

super.onCreate(savedInstanceState, persistentState)

setContentView(R.layout.activity_main)

button.setOnClickListener { text.text = "You've clicked a button" }

}

}

这太简单了,不是吗?

基本上,findViewById()方法仍在使用中。 但是没有必要自己写。 Kotlin会为你做。

当您使用Android扩展时,findCachedViewById()函数和HashMap实例将会自动生成。 每次通过其标识符访问您的视图将被一个新的函数调用替换。 如果是第一次访问视图,此函数将调用通常的findViewById()函数,并将接收的视图添加到HashMap中,以便在下次访问视图时从中检索视图。

5. 你可以更容易地使用集合

让我们谈谈Kotlin的集合。 因为我们经常需要使用数据模型集合执行困难的操作。 例如,我们可能有一个学生名单,我们需要从中检索三个A级成绩的学生和两个B成绩的学生。

看看Kotlin的解决方案:

?

1

2

3

4

5
var students = listOf(Student("John", 0), Student("Julia", 2), Student("Matt", 1),

Student("Katie", 0), Student("Dan", 0))

var firstList = students.filter { it.mark == 0 }.take(3)

var secondList = students.filter { it.mark == 1 }.take(2)

下面是我们如何解决Java中的同样的问题:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23
ArrayList<Student> students = new ArrayList<Student>() {{

add(new Student("John", 0));

add(new Student("Julia", 2));

add(new Student("Matt", 1));

add(new Student("Katie", 0));

add(new Student("Dan", 0));

}};

ArrayList<Student> firstList = new ArrayList<>();

ArrayList<Student> secondList = new ArrayList<>();

for (Student student: students) {

boolean isFirstFilled = firstList.size() >= 3;

boolean isSecondFilled = secondList.size() >= 2;

if (isFirstFilled && isSecondFilled) break;

int mark = student.getMark();

if (mark == 0 && !isFirstFilled) {

firstList.add(student);

} else if (mark == 1 && !isSecondFilled) {

secondList.add(student);

}

}

这只是一个小例子,说明如何在KotlinJava中使用集合,但你可以看到差别! 你能想象如果我们处理一个大项目的集合,Kotlin会有什么区别吗?

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Kotlin 与 Java基本语法对比 https://www.kuaiidc.com/116410.html

相关文章

发表评论
暂无评论