Kotlin 与 Java基本语法对比
Kotlin与Java基本语法对比
Kotlin比Java更年轻,但它是一个非常有前途的编程语言,它的社区不断增长。每个人都在谈论它,并说它很酷。但为什么这么特别?
我们准备了一系列文章,分享我们在Kotlin开发Android应用程序的经验。我们将讨论Kotlin与Java在语法,可用性,UI性能和异步性方面的区别,以便您可以决定哪种语言最适合您。
让我们从一些基本的语法差异开始。这是第一个:
1.使用Kotlin,你可以用更少的代码做更多
Kotlin的一个主要优点是它的简洁。你用更少的代码获得更多的功能。而你写的代码越少,你犯的错误就越少。这很简单。让
我们看看Kotlin的基础知识,从类开始。
publicfinalclassPerson{ privateStringname; privateintage; privatefloatheight; publicPerson(Stringname,intage,floatheight){ this.name=name; this.age=age; this.height=height; } publicPerson(Stringname,intage){ this.name=name; this.age=age; this.height=1.8f; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicintgetAge(){ returnage; } publicvoidsetAge(intage){ this.age=age; } publicfloatgetHeight(){ returnheight; } publicvoidsetHeight(floatheight){ this.height=height; } @Override publicStringtoString(){ return"Person{"+ "name='"+name+'\''+ ",age="+age+ ",height="+height+ '}'; } @Override publicbooleanequals(Objecto){ if(this==o)returntrue; if(o==null||getClass()!=o.getClass())returnfalse; Personperson=(Person)o; if(age!=person.age)returnfalse; if(Float.compare(person.height,height)!=0)returnfalse; returnname!=null?name.equals(person.name):person.name==null } @Override publicinthashCode(){ intresult=name!=null?name.hashCode():0; result=31*result+age; result=31*result+(height!=+0.0f?Float.floatToIntBits(height):0); returnresult; } }
上面是一个通常的Java类。它做的不多。它只包含一些数据。但是,当你意识到它给表带来的不足时,看看这段代码有多大是很痛苦的。为了鼓励你,我们会给你一个等同的类写在Kotlin。
dataclassPerson(varname:String, varage:Int, varheight:Float=1.8f)
是的,你会为你的数据类自动获取需要的getters,setters,equals(),hashcode(),toString()和copy()函数!当然,你可以轻松地重写这些函数,但在大多数情况下,只需声明类及其属性就足够了。
这正是我们的意思,当我们说Kotlin简洁。
2.你可以避免NullPointerException
现在我们想提醒你在许多编程语言中最大的痛苦-空指针异常。我们几乎不能想象自从托尼·霍尔在1965年发明它之后,有多少开发者遭受了空指针,同时试图使事情更简单一些。
可悲的是,我们不能及时回来,防止Tony犯这个错误。但是使用Kotlin,我们现在可以轻松地转义NullPointerException。
valperson:Person?=null ... person?.name="John"
如果变量是可空的,编译器将不允许你访问它没有适当的检查。Kotlin强迫你使用?运算符。这可以防止应用程序自动崩溃。
它如何在引擎盖下工作?让我们回顾一下生成的字节码。
L2 LINENUMBER18L2 ALOAD3 DUP IFNULLL3 LDC"John" INVOKEVIRTUALigalata/com/kotlinexample/Person.setName(Ljava/lang/String;)V GOTOL4 L3 POP
正如你所看到的,我们在这里有相同的空检查。JetBrains的开发人员(创建Kotlin)知道每次检查我们的变量是避免NullPointerException的唯一方法。但他们也知道Android开发人员不想在他们的项目中处理NullPointerException。他们可能想:“为什么不自动生成这个检查如果变量是可空的?
JetBrains的开发人员只是这样,让我们的生活更容易了!
3.你可以摆脱util类
让我们来讨论一下有关使用util类的丑陋事情。你有没有一个项目没有他们?我们几乎不记得这一切。Kotlin有一个聪明的解决方案-扩展功能-帮助你摆脱所有的util类一劳永逸。
扩展函数几乎是一个通常的Kotlin函数。但是当你声明它,你需要指定的实例将具有扩展功能的类。
funContext.toast(text:String)=Toast.makeText(this,text,Toast.LENGTH_SHORT).show()
注意'this',我们作为参数传递给makeText()方法?它不是类的一个实例,我们声明这个函数,而是一个Context实例。现在你可以直接从你的Activity或任何其他Context实例调用这个函数。例如:
toast("Hi")
你应该记住,扩展函数不以任何方式修改它扩展的类。那么它如何工作而不改变原来的类?让我们再次看到字节码。
publicfinaltoast(Landroid/content/Context;Ljava/lang/String;)V @Lorg/jetbrains/annotations/NotNull;()//invisible,parameter0 @Lorg/jetbrains/annotations/NotNull;()//invisible,parameter1 L0 ALOAD1 LDC"$receiver" INVOKESTATICkotlin/jvm/internal/Intrinsics.checkParameterIsNotNull(Ljava/lang/Object;Ljava/lang/String;)V ALOAD2 LDC"text" INVOKESTATICkotlin/jvm/internal/Intrinsics.checkParameterIsNotNull(Ljava/lang/Object;Ljava/lang/String;)V L1 LINENUMBER31L1 ALOAD1 ALOAD2 CHECKCASTjava/lang/CharSequence ICONST_0 INVOKESTATICandroid/widget/Toast.makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; INVOKEVIRTUALandroid/widget/Toast.show()V L2 LINENUMBER32L2 RETURN L3 LOCALVARIABLEthisLigalata/com/kotlinexample/MainActivity;L0L30 LOCALVARIABLE$receiverLandroid/content/Context;L0L31 LOCALVARIABLEtextLjava/lang/String;L0L32 MAXSTACK=3 MAXLOCALS=3
哈!您的函数隐式接收它作为第一个参数扩展的类的实例。因此,在字节码中,对函数体中“this”的任何访问都将替换为对第一个参数的访问。没有魔法真的。您可以在项目的任何位置使用此函数。
时间删除你的util包!
4.你可以忘记视图绑定
你还记得findViewById()method()吗?我们相信你不喜欢它。我们也不是。此外,我们不想为我们需要访问的每个视图声明变量和Butterknife注释。
你可以忘记与KotlinAndroidExtensions的视图绑定。不再需要创建变量和绑定视图。您可以使用在xml布局中声明的标识符直接访问您的视图。
publicclassMainActivityextendsAppCompatActivity{ @Override protectedvoidonCreate(@NullableBundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Buttonbutton=(Button)findViewById(R.id.button); finalTextViewtext=(TextView)findViewById(R.id.text); button.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewv){ text.setText("You'veclickedabutton"); } }); } } classMainActivity:AppCompatActivity(){ overridefunonCreate(savedInstanceState:Bundle?,persistentState:PersistableBundle?){ super.onCreate(savedInstanceState,persistentState) setContentView(R.layout.activity_main) button.setOnClickListener{text.text="You'veclickedabutton"} } }
这太简单了,不是吗?
基本上,findViewById()方法仍在使用中。但是没有必要自己写。Kotlin会为你做。
当您使用Android扩展时,findCachedViewById()函数和HashMap实例将会自动生成。每次通过其标识符访问您的视图将被一个新的函数调用替换。如果是第一次访问视图,此函数将调用通常的findViewById()函数,并将接收的视图添加到HashMap中,以便在下次访问视图时从中检索视图。
5.你可以更容易地使用集合
让我们谈谈Kotlin的集合。因为我们经常需要使用数据模型集合执行困难的操作。例如,我们可能有一个学生名单,我们需要从中检索三个A级成绩的学生和两个B成绩的学生。
看看Kotlin的解决方案:
varstudents=listOf(Student("John",0),Student("Julia",2),Student("Matt",1), Student("Katie",0),Student("Dan",0)) varfirstList=students.filter{it.mark==0}.take(3) varsecondList=students.filter{it.mark==1}.take(2)
下面是我们如何解决Java中的同样的问题:
ArrayListstudents=newArrayList (){{ add(newStudent("John",0)); add(newStudent("Julia",2)); add(newStudent("Matt",1)); add(newStudent("Katie",0)); add(newStudent("Dan",0)); }}; ArrayList firstList=newArrayList<>(); ArrayList secondList=newArrayList<>(); for(Studentstudent:students){ booleanisFirstFilled=firstList.size()>=3; booleanisSecondFilled=secondList.size()>=2; if(isFirstFilled&&isSecondFilled)break; intmark=student.getMark(); if(mark==0&&!isFirstFilled){ firstList.add(student); }elseif(mark==1&&!isSecondFilled){ secondList.add(student); } }
这只是一个小例子,说明如何在Kotlin和Java中使用集合,但你可以看到差别!你能想象如果我们处理一个大项目的集合,Kotlin会有什么区别吗?
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!