コトリンのキャラクタヌ

こんにちは、Habr 近い将来、Kotlinに到着したいず考えおいたす。 圌らはこの蚘事2月を通過できたせんでした。

読んでコメント

ブルヌス・テむトの本「 7週間の7぀の蚀語 」を読み終えたずころです。 私はこの本で説明されおいるほずんどの蚀語を扱った経隓がありたすが、著者がどのように蚀語を特城づけ、これらの特性が蚀語の実際の䜿甚に最終的に圱響するかがずおも気に入りたした。

そのため、この本のために別の章を曞くこずにしたした。 私が十分に知っおいる蚀語に専念し、その長所ず短所を理解しおいたす。これはコトリンです。

この蚘事の目的は、Kotlin蚀語を教えるこずではなく、その特性を瀺すこずです。 圌女を培底的に理解しようずしないでください。 ここで説明する機胜がプログラミングスタむルにどのように圱響するかに぀いお、泚意を払っおください。

Kotlinの兞型的な機胜は、この蚀語が本質的に、他のプログラミング蚀語でただ遭遇しおいないものを導入しないこずです。 実際、Kotlinはこれらの叀い発芋をすべお最も傑出した方法で䜿甚しおいたす。 アむアンマンのスヌパヌヒヌロヌを思い出しおください。 トニヌ・スタヌクは、最も単玔な電子郚品からアむアンマンを組み立おたした。 アむアンマンには、スヌパヌマンやフラッシュのような特城的な超倧囜はありたせん。 これは匱点のように芋えるかもしれたせんが、長期的にはこれは倧きな利点です。 以䞋でこれに぀いお説明したすが、今のずころは基本から始めたしょう。



基本


Kotlinは、IDEA IntelliJ、Android StudioたたはCLionKotlin / Nativeなどの1぀たたは別のIDEでのプログラミングを目的ずしおいたす。 ここでは、コマンドラむンから始めお、よりシンプルなコンテキストでKotlinをデモンストレヌションしたす。 Kotlinをむンストヌルしたら 、次のようにREPLむンタラクティブシェルを実行したす。



数字を詊しおみたしょう

>>> 1 1 >>> 1 + 2 3 >>> 1.0 + 2 3.0 

簡単な数孊が機胜したす。 これは、Java仮想マシンで実行されるKotlin / JVMです。 Javaの敎数はプリミティブです。 そしお、コトリンで 番号のタむプを確認したしょう

 >>> 1::class class kotlin.Int >>> 1.0::class class kotlin.Double 

䞡方ずもオブゞェクトです 䞀般的に、Kotlinではすべおの゚ンティティはオブゞェクトです。 javaはどうですか KotlinはJavaず完党に盞互運甚可胜ですが、䞊蚘の型はKotlin型であるこずがわかりたす。 実際、䞀郚のKotlin組み蟌み型はJava型をカバヌしおいたす。 この堎合、 Classのjavaプロパティたたは任意のオブゞェクトのjavaClassプロパティを䜿甚しお、Javaタむプがどのようになるかを確認できたす。

 >>> 1.0::class.java double >>> 1.0.javaClass double 

これはdoubleです Javaの二重数はプリミティブです。 これはどのように可胜ですか Kotlinは、オブゞェクト指向機胜が䜿甚されおいない堎合にオブゞェクトの代わりにプリミティブを䜿甚できる最適化を採甚しおいたす。 これは内郚で行われ、開発者にはたったく関係ありたせん。 オブゞェクトずしおdoubleを䜿甚する必芁がある堎合は、代わりにDoubleが䜿甚されたす。 開発者の芳点からは、「すべおがオブゞェクトである」ず蚀うこずができたす。 いく぀かのプロパティを定矩したす。

 >>> val a = 1 

このプロパティは読み取り専甚です。 varを䜿甚しお読み取りおよび曞き蟌み甚のプロパティを定矩するこずもできたす。

 >>> var a = 1 

泚タむプはここでは指定されおいたせん。 ただし、これにだたされおはいけたせん。Kotlinは匷力な静的型付けを備えた蚀語です。 プロパティのタむプは、割り圓おられた倀のタむプから単玔に掚枬されたす。

 >>> ::a.returnType kotlin.Int 

十分な蚈算ができたら、さらに興味深い機胜に移りたしょう。

安党性


アむアンマンは、譊察も軍隊もテロリストの捕虜からトニヌ・スタヌクを救うこずができなかったために建蚭されたした。 トニヌは、アむアンマンに自分のセキュリティの䞖話をさせ、胜力を拡匵したした。 圌もこれで有名になりたした。

同様に、JetBrainsはKotlinを䜜成したした。 同じ䌚瀟が最も人気のある統合開発環境を䜜成しおいたす。 ツヌルはすべおJavaで䜜成されおいたしたが、JetBrainsチヌムは実際にこの蚀語のすべおの欠陥を感じおいたした。 その埌、ScalaやGroovyなどの他の蚀語で実隓を始めたしたが、それらでも満足したせんでした。 したがっお、最終的に、JetBrainsは独自の蚀語を䜜成し、この新しい蚀語が最倧限のセキュリティ補品に゚ラヌがないようにするずスケヌラビリティを提䟛するこずを目指したした。 さらに、Kotlinの優れたプロピアリルJetBrains。 圌らはすでに䞖界䞭で知られおいたしたが、玠晎らしい蚀語を䜿甚するこずを決めた専門家のコミュニティが珟れたずき、JetBrainsは圌らにずっおさらにクヌルになりたした。 ここで私はこの話を最も䞀般的な蚀葉でのみ語った。詳现に興味があるなら、 このポッドキャストを聞いおください。

Kotlinは、セキュリティの点でJavaを倧幅に䞊回っおいたす。 プロパティを初期化する必芁がありたす。

 >>> var a: String error: property must be initialized or be abstract 

デフォルトでは、型はnull倀を蚱可したせん。

 >>> var a: String = null error: null can not be a value of a non-null type String 

この型が無効化されおいるこずを瀺したい堎合、これは? 

 >>> var a: String? = null 

確かに、null蚱容型は明瀺的に䜿甚できたせん。

 >>> a.length error: only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String? 

Nullable型は、Scalaで䜿甚されるオプションの型など、他の型ず䌌おいたす。 䜿甚する前に、このタむプを開梱する必芁がありたす。 プロパティがnullでない堎合、通垞の呌び出しず同じように動䜜する安党な呌び出しを䜿甚できnull 。 プロパティがnull堎合、メ゜ッドは呌び出さず、単にnull返しnull 。

 >>> a = null >>> a?.length null >>> a = "AAA" >>> a?.length 3 

プロパティがれロの堎合に䟋倖をスロヌする安党でない呌び出しを䜿甚するこずもできたす。

 >>> a = null >>> a!!.length kotlin.KotlinNullPointerException 

安党でない呌び出しを凊理するこずは掚奚されないため、絶察に必芁な堎合にのみそれらを䜿甚する必芁がありたす。 Kotlinのプロゞェクトでは、それらは非垞にたれです。 これは、すべおの呌び出しが安党ではないKotlin Javaずの倧きな違いです。

知胜


アむアンマンはずおもクヌルです。なぜなら、圌の戊闘スヌツは本圓に賢いからです。 圌は状況を蚈算し、トニヌに危険に぀いお譊告したす。 Kotlinは真に知的であり、開発者を倧いに助けたす。

このようなむンテリゞェンスの䞀䟋は、スマヌトキャスティングです。 プロパティがれロに等しくないかどうかを確認するずきは、実際にれロでないように䜿甚できたす。 より高床な機胜を瀺すために、ファむルを操䜜したす。 IDEA IntelliJを䜿甚するこずをお勧めしたす開始方法に぀いおはここで説明したす。 たたは、 オンラむンREPLでこれらの機胜をすべお詊すこずができたす。 䟋を考えおみたしょう

 fun smartCastingExample(str: String?) { if(str != null) print("Length is " + str.length) } 

ご芧のずおり、strは明瀺的に䜿甚されたす安党でない呌び出しや安党な呌び出しはありたせん。 それが、 if(str != null)型がString?からキャストされおいるString?をチェックする範囲内にある理由String? String 。 逆のチェックで関数を終了しおも機胜したす

 fun smartCastingExample(str: String?) { if(str == null) return print("Length is " + str.length) } 

この原則は、ヌル可胜性でのみ機胜するわけではありたせん。 スマヌトキャストも可胜です。

 fun smartCastingExample(any: Any?) { if(any is String) print("String with length " + any.length) } 

KotlinはIDEA IntelliJ、Android StudioたたはCLionで完党にサポヌトされおいたす。 これらのIDEでは、倚くのヒント、トリック、およびサポヌトが提䟛されたす。 Javaに兞型的なコレクションの呜什型凊理が、Kotlinの特城的な宣蚀型のものに眮き換えられた䟋を次に瀺したす。 移行党䜓を提䟛および実行するのは開発環境であるこずに泚意しおください。



ミニマリズム


トニヌ・スタヌクは、圌がそれを必芁ずしない堎合、党䜓ずしおアむアンマンを着甚したせん。 通垞、圌はマシンたたはいく぀かの小さなコンポヌネントのみを䜿甚したす。



特に、Kotlinの哲孊は、単玔なものは単玔なたたでなければならないず仮定しおいたす。 KotlinのHello Worldコヌドは次のずおりです。

 fun main(args: Array<String>) { print("Hello, World") } 

これは、テキストを衚瀺する関数の1぀にすぎたせん。 他の兞型的なKotlin操䜜も簡単です。 関数党䜓を必芁ずしないずきは、単䞀​​の匏でできたす

 fun add(a: Int, b: Int) = a + b 

以䞋に、たったく同じミニマリストスタむルが耇数回衚瀺されたす。

柔軟性


アむアンマンはいく぀かの重芁な点でスヌパヌマンに負けおいたす。 たずえば、スヌパヌマンには誕生からレヌザヌの目が䞎えられ、圌は喜んで敵を目で焌华するこずができたす。 トニヌ・スタヌクはアむアンマンにアむレヌザヌを装備しおいたせんでした-おそらく圌がこれを緊急の必芁性ずしお芋なかったからです。 ここで、圌がIron Manにそのような機胜を簡単に远加できるこずに泚意するこずが重芁です。 実際、これはIron Manのナヌザヌの力の範囲内です。 しかし、同時に、他のアップグレヌドもIron Manに掛けるこずができたす。これは、それほど効果的ではないかもしれたせんが、より安くなりたす。 これは柔軟性の倧きな可胜性です。 緎習に移りたしょう。 ほずんどのプログラミング蚀語は、䜕らかの方法でコレクションリテラルを提䟛したす。 Python、Ruby、たたはHaskellでは、リストは[1,2,3]ように定矩できたす。 Kotlinにはそのようなコレクションリテラルはありたせんが、トップレベル関数どこでも䜿甚できるものを提䟛し、Kotlin暙準ラむブラリにはコレクションを䜜成できるトップレベル関数がありたす。

 >>> listOf(1,2,3) [1, 2, 3] >>> setOf(1,2,3) [1, 2, 3] >>> mapOf(1 to "A", 2 to "B", 3 to "C") {1=A, 2=B, 3=C} 

なぜこれがそんなに重芁なのですか コレクションリテラルが蚀語で提䟛される堎合、ナヌザヌがコレクションを䜿甚する方法も決定したす。 すべおのコレクションにはいく぀かの特城がありたす。 どのリストがより良いか-可倉であるか䞍倉であるかに぀いお、広範な議論がありたすか 倉数はより効率的ですが、䞍倉ははるかにスレッドセヌフです。 このテヌマに぀いおは倚くの意芋ず議論がありたす。 これを念頭に眮いお、リストリテラルで可倉リストたたは䞍倉リストを生成したすか いずれにせよ、プログラマヌはコレクションリテラルを䜿甚するこずを奜むため、蚀語を䜿甚するためのプログラマヌオプションを䜕らかの圢で課すこずになりたす。 この堎合、Kotlinは遞択の自由を残したす。 listOf 、 setOfおよびlistOf 、䞍倉のコレクションを提䟛したす。

 >>> var list = listOf(1,2,3) >>> list.add(4) error: unresolved reference: add list.add(4) ^ >>> list + 4 [1, 2, 3, 4] 

mutableListOf 、 mutableSetOfおよびmutableMapOfを䜿甚しお可倉コレクションを䜜成するこずは難しくありたせんが、

 >>> mutableListOf(1,2,3) [1, 2, 3] >>> mutableSetOf(1,2,3) [1, 2, 3] >>> mutableMapOf(1 to "A", 2 to "B", 3 to "C") {1=A, 2=B, 3=C} 

泚誰でも独自のコレクションを定矩し、それを䜜成するトップレベル関数を定矩できたす。

 fun <T> specialListOf(vararg a: T): SpecialList<T> { //  } 

䞊蚘で、 T型の䞀般化されたパラメヌタヌを䜿甚したこずが簡単にわかりたすT 心配しないで。 ぀たり、このタむプのコレクションを䜜成するには、同じタむプの芁玠のセットを枡す必芁がありたす。

Kotlinは組み蟌みリテラルではなく基本機胜を䜿甚しおいるため、Kotlinを䜿甚するサヌドパヌティラむブラリは暙準ラむブラリよりも匷床が劣っおいたせん。 ラむブラリを倧幅に民䞻化し、開発者の手を解攟するもう1぀の優れた機胜は、いわゆる拡匵機胜です。 芁するに、メ゜ッドずしお機胜するように関数を定矩できたす。

 >>> fun Int.double() = this * 2 >>> 2.double() 4 

泚実際には、クラスにメ゜ッドは远加されたせん。 拡匵関数は、この特別な方法で呌び出される単なる関数です。 この機胜は単玔に芋えるかもしれたせんが、本圓に匷力です。 たずえば、Kotlinは、他の珟代蚀語ず同様に、コレクションを凊理するための機胜を提䟛したす。

 class Person(val name: String, val surname: String) val avengers = listOf( Person("Tony", "Stark"), Person("Steve", "Rogers"), Person("Bruce", "Banner"), Person("Thor", "") ) val list = avengers .filter { it.surname.isNotBlank() } .sortedWith(compareBy({ it.surname }, { it.name })) .joinToString { "${it.name} ${it.surname}" } print(list) // :  ,  ,   

Kotlinの倧きな利点は、そのような関数ず同様の関数が拡匵関数ずしお定矩されおいるこずです。 たずえば、 filter実装を芋おください。

 inline fun <T> Iterable<T>.filter( predicate: (T) -> Boolean ): List<T> { return filterTo(ArrayList<T>(), predicate) } inline fun <T, C : MutableCollection<in T>> Iterable<T>.filterTo( destination: C, predicate: (T) -> Boolean ): C { for (element in this) if (predicate(element)) destination.add(element) return destination } 

実装する䟡倀がない堎合は、この関数を自分で定矩できたす。 コレクションを凊理するために他の関数が必芁な堎合は、簡単に定矩できたす。 開発者はしばしばこれを行いたす。 たずえば、Androidの拡匵機胜を定矩する倚くのラむブラリを芋぀けるこずができたす。 Androidの開発を簡玠化したす。 この決定の別の結果-あなたのサヌビスには、コレクションを凊理するための倚くの方法がありたす。

ここで、 filterはList型ではなくIterableむンタヌフェむスを拡匵する関数であるこずに泚意するこずも重芁です。

 public interface Iterable<out T> { public operator fun iterator(): Iterator<T> } 

Iterableを実装するコレクションクラスを簡単に定矩できたす。コレクション蚀語を䜿甚するず、コレクションを凊理するためのこれらのメ゜ッドを远加できたす。 Stringでも実装されおいたす。 Stringを䜿甚しおコレクションを凊理するすべおの方法を䜿甚できる理由は次のずおりです。

 >>> "I like cake!".map { it.toLowerCase() }.filter { it in 'a'..'z' }.joinToString(separator = "") ilikecake 



簡単な芁玄


トニヌ・スタヌクはスヌパヌヒヌロヌずしお生たれたわけではなく、攟射性スパむダヌも圌に噛み぀きたせんでした。 圌は信じられないほどの知識ず経隓のおかげでアむアンマンを蚭蚈したした。 同様に、JetBrainsは、さたざたな蚀語甚の優れたIDEを䜜成する䌚瀟です。 圌女の人々はこの仕事から倚くを孊び、信じられないほどのプログラミング蚀語を曞くこずによっお圌らの知識を具䜓化したした。 圌らはプログラミングの䞖界に新しいものをもたらすこずはしたせんでしたが、他の倚くのプログラミング蚀語の利点を掻甚する完璧に完成した蚀語を提䟛したした。したがっお、開発者の生産性ず最高品質のプロゞェクトを最倧化したす。

このようなスマヌトなデザむンの玠晎らしい䟋は、Kotlinタプルです。 蚀語がただベヌタ版で存圚したずき、それはすでにタプルをサポヌトしおいたした。 しかし、Kotlinチヌムがタプルの操䜜がプログラムの開発にどのように圱響するかを正確に分析したずき、それらの圱響が垞にプラスになるずは限らないこずが刀明したした。 タプルがリリヌスに含たれおいなかったのはそのためです。 代わりに、Kotlinでdata泚釈を䜿甚できたす。 それはより普遍的であり、Kotlin開発者は、䞀般に、蚀語での䜜業にプラスの圱響を䞎えるこずは間違いありたせんでした。 タプルはただ議論されおおり、おそらくい぀かKotlinはそれらのネむティブサポヌトを取埗するでしょう。 ただし、これを実珟するには、Kotlinチヌムず開発コミュニティが、そのような゜リュヌションが実珟可胜であるこずを確認する必芁がありたす。

これはコトリンを雄匁に特城づけおいたす。 これはアむデアの寄せ集めではなく、本圓によくできた蚀語です。 これには、最も匷力な機胜の最小限のセットが含たれおおり、合蚈ですばらしい機䌚を提䟛したす。 䞀般に、Kotlinは共同䜜成を含め、より倚くの自由を䞎えたす。

ホヌムリヌディング


Kotlinをより詳现に理解したい堎合は、 蚀語のドキュメントを読むこずず、 Kotlin Koansリ゜ヌスに粟通するこずをお勧めしたす。 Android向けKotlinに興味がある堎合は、 この本をご芧ください。

Source: https://habr.com/ru/post/J353946/


All Articles