Kotlin 与 Java基本语法对比

Kotlin比Java更年轻,但它是一个非常有前途的编程语言,它的社区不断增长。 每个人都在谈论它,并说它很酷。 但为什么这么特别?
我们准备了一系列文章,分享我们在Kotlin开发Android应用程序的经验。 我们将讨论Kotlin与Java在语法,可用性,UI性能和异步性方面的区别,以便您可以决定哪种语言最适合您。
让我们从一些基本的语法差异开始。 这是第一个:
1. 使用Kotlin,你可以用更少的代码做更多
Kotlin的一个主要优点是它的简洁。 你用更少的代码获得更多的功能。 而你写的代码越少,你犯的错误就越少。 这很简单。 让
我们看看Kotlin的基础知识,从类开始。
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。
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。
val person: Person? = null ... person?.name = "John"
如果变量是可空的,编译器将不允许你访问它没有适当的检查。 Kotlin强迫你使用? 运算符。 这可以防止应用程序自动崩溃。
它如何在引擎盖下工作? 让我们回顾一下生成的字节码。
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实例调用这个函数。 例如:
toast("Hi")
你应该记住,扩展函数不以任何方式修改它扩展的类。 那么它如何工作而不改变原来的类? 让我们再次看到字节码。
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布局中声明的标识符直接访问您的视图。
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的解决方案:
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中的同样的问题:
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);
}
}
这只是一个小例子,说明如何在Kotlin和Java中使用集合,但你可以看到差别! 你能想象如果我们处理一个大项目的集合,Kotlin会有什么区别吗?
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Kotlin
# 与
# Java基本语法
# Java比较
# Java基本语法之内部类示例详解
# 深入理解Java8新特性之Lambda表达式的基本语法和自定义函数式接口
# Java8之lambda表达式基本语法
# Java基本语法笔记(菜鸟必看篇)
# Java面试题之基本语法(图解)
# Java入门基础之Java的基本语法与Java所支持的数据类型
# Java基本语法小白入门级
# 你可以
# 让我们
# 是一个
# 您的
# 第一个
# 您可以
# 绑定
# 开发人员
# 当你
# 更容易
# 霍尔
# 自动生成
# 更少
# 越少
# 应用程序
# 有一个
# 编程语言
# 的是
# 这是
# 在这里
相关文章:
建站ABC备案流程中有哪些关键注意事项?
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
如何选择域名并搭建高效网站?
如何用景安虚拟主机手机版绑定域名建站?
深圳企业网站制作设计,在深圳如何网上全流程注册公司?
网站网页制作专业公司,怎样制作自己的网页?
青浦网站制作公司有哪些,苹果官网发货地是哪里?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
独立制作一个网站多少钱,建立网站需要花多少钱?
如何在云指建站中生成FTP站点?
如何在建站宝盒中设置产品搜索功能?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
如何获取上海专业网站定制建站电话?
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
如何选择适配移动端的WAP自助建站平台?
,网页ppt怎么弄成自己的ppt?
详解jQuery中基本的动画方法
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
如何破解联通资金短缺导致的基站建设难题?
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
制作证书网站有哪些,全国城建培训中心证书查询官网?
建站主机如何选?高性价比方案全解析
相册网站制作软件,图片上的网址怎么复制?
html制作网站的步骤有哪些,iapp如何添加网页?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
黑客入侵网站服务器的常见手法有哪些?
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
岳西云建站教程与模板下载_一站式快速建站系统操作指南
建站之星上传入口如何快速找到?
油猴 教程,油猴搜脚本为什么会网页无法显示?
宝塔建站后网页无法访问如何解决?
如何快速辨别茅台真假?关键步骤解析
安徽网站建设与外贸建站服务专业定制方案
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
简历在线制作网站免费版,如何创建个人简历?
制作表格网站有哪些,线上表格怎么弄?
Python文件管理规范_工程实践说明【指导】
如何获取免费开源的自助建站系统源码?
,交易猫的商品怎么发布到网站上去?
建站之星安装失败:服务器环境不兼容?
贸易公司网站制作流程,出口贸易网站设计怎么做?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
定制建站价位费用解析与套餐推荐全攻略
如何在阿里云完成域名注册与建站?
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
营销式网站制作方案,销售哪个网站招聘效果最好?
*请认真填写需求信息,我们会在24小时内与您取得联系。