Kotlin Vs Java: süntaksi peamised erinevused

Kotlin on tõesti paljutõotav keel ja kõik räägivad seda ja ütlevad, et see on lahe. Aga miks see nii eriline on?

Arutleme, kuidas Kotlin erineb Java-st süntaksi, kasutatavuse ja kasutajaliidese toimivuse osas.

Süntaksi erinevus

1) Vähema koodiga saate teha rohkem

Kotlini üks peamisi eeliseid on selle kokkuvõtlikkus. Saate rohkem funktsioone vähem koodi. Ja mida vähem koodi kirjutate, seda vähem vigu teete

avalik lõpuklass Isik {
    privaatne keelnimi;
    privaatne vanus;
    privaatne ujuki kõrgus;

    avalik isik (stringinimi, vanus, ujuki kõrgus) {
        see.nimi = nimi;
        see.age = vanus;
        see.kõrgus = kõrgus;
    }

    avalik isik (stringinimi, vanus) {
        see.nimi = nimi;
        see.age = vanus;
        see.kõrgus = 1,8f;
    }

    avalik stringi getName () {
        tagasi nimi;
    }

    public void setName (stringi nimi) {
        see.nimi = nimi;
    }

    avalik int getAge () {
        naasmise vanus;
    }

    public void setAge (keskmine vanus) {
        see.age = vanus;
    }

    avalik ujuk getHeight () {
        tagasitulekõrgus;
    }

    public void setHeight (ujuki kõrgus) {
        see.kõrgus = kõrgus;
    }

    @Ülesõit
    avalik keel stringi () {
        tagasi "Isik {" +
                "nimi = '" + nimi +' \ '' +
                ", vanus =" + vanus +
                ", kõrgus =" + kõrgus +
                '}';
    }

    @Ülesõit
    avalik boolean võrdub (objekt o) {
        if (this == o) tagastab true;
        if (o == null || getClass ()! = o.getClass ()) tagastab vale;

        Isik inimene = (Isik) o;

        if (vanus! = inimene.age) tagastama vale;
        if (Float.compare (inimene.kõrgus, kõrgus)! = 0) tagastab vale;
        tagasi nimi! = null? nimi.equals (isik.nimi): isik.nimi == null
    }

    @Ülesõit
    avalik int hashCode () {
        int tulemus = nimi! = null? nimi.hashCode (): 0;
        tulemus = 31 * tulemus + vanus;
        tulemus = 31 * tulemus + (kõrgus! = + 0,0f? Float.floatToIntBits (kõrgus): 0);
        tagastamise tulemus;
    }
}

Üle ühe on tavaline Java klass, kus on setterid ja getterid. Vaadakem, kuidas saaksime Kotlinis seda rakendada

andmeklass Isik (var name: String,
                 var vanus: keskmine,
                 var kõrgus: ujuk = 1,8 f)

Jah, saate oma andmeklassi jaoks automaatselt vajalikud getterid, setterid, equals (), hashcode (), toString () ja copy () funktsioonid! Muidugi saate need funktsioonid hõlpsalt mööda lükata, kuid enamikul juhtudel piisab klassi ja selle omaduste deklareerimisest.

2) vältige NullPointerExceptioni

val inimene: inimene? = null
inimene? .name = "Johannes"

Kui muutuja on tühi, ei luba kompilaator sellele ilma korraliku kontrollimiseta juurde pääseda. Kotlin sunnib sind kasutama a ?. operaator. See hoiab ära rakenduse automaatse krahhi.

3) Võite vabaneda util klassidest

Igas projektis peaksid olema utilitunnid. Kas teil on kunagi olnud projekti ilma nendeta?

Kotlinil on nutikas lahendus - laiendusfunktsioonid -, mis aitab kõigist oma kasutustundidest lõplikult lahti saada.

Laiendusfunktsioon on peaaegu tavaline Kotlini funktsioon. Kuid selle deklareerimisel peate määrama klassi, mille eksemplaridel on laiendusfunktsioon.
lõbus Context.toast (tekst: String) = Toast.makeText (see tekst, Toast.LENGTH_SHORT) .show ()

Kas panete tähele seda, et edastame parameetrina makeText () meetodi? See ei ole klassi näide, kus me selle funktsiooni kuulutame, pigem on see kontekstinäide. Ja nüüd saate sellele funktsioonile helistada otse oma tegevusest või muust kontekstiesitlusest. Näiteks:

röstsai ("Tere")

4) Unustage vaate sidumine

Kas mäletate meetodit findViewById () ()? Oleme kindlad, et see teile ei meeldi. Me ei tee kumbagi. Samuti ei soovi me deklareerida muutujaid ja Butterknife annotatsioone iga kuva jaoks, millele peame juurde pääsema.

Kotlini Android-laiendite abil saate vaate sidumise unustada. Enam ei pea te muutujaid looma ja vaateid siduma. Vaadetele pääsete juurde otse nende tunnuste abil, mis on deklareeritud xml-paigutuses.

avaliku klassi MainActivity laiendab AppCompatActivity {
    @Ülesõit
    kaitstud tühine onCreate (@Nullable Bundle savedInstanceState) {
        super.onCreate (SaveInstanceState);
        setContentView (R.layout.activity_main);

        Nupunupp = (Button) findViewById (R.id.button);
        final TextView text = (TextView) findViewById (R.id.text);
        button.setOnClickListener (uus vaade.OnClickListener () {
            @Ülesõit
            avalik tühine onClick (vaade v) {
                text.setText ("olete klõpsanud nuppu");
            }
        });
    }
}

klass MainActivity: AppCompatActivity () {

    alistada lõbus onCreate (SaveInstanceState: Bundle ?, persistentState: PersistableBundle?) {
        super.onCreate (SaveInstanceState, persistentState)
        setContentView (R.layout.activity_main)

        button.setOnClickListener {text.text = "Klõpsasite nuppu"}
    }
}

5) Töötage kollektsioonidega palju kergemini

Nüüd päevade kaupa peame igas projektis tegema raskeid toiminguid andmemudelite kogumitega.

Näiteks võib meil olla nimekiri õpilastest, kelle hulgast peame leidma kolm A-klassi õpilast ja kaks B-klassi õpilast.

Vaata Kotlini lahendust:

var õpilased = listOf (õpilane ("John", 0), õpilane ("Julia", 2), õpilane ("Matt", 1),
                Üliõpilane ("Katie", 0), Üliõpilane ("Dan", 0))

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

Saate sama probleemi Java-s lahendada järgmiselt:

ArrayList  students = uus ArrayList  () {{
            lisa (uus Õpilane ("Johannes", 0));
            lisa (uus Õpilane ("Julia", 2));
            lisa (uus Õpilane ("Matt", 1));
            lisa (uus Õpilane ("Katie", 0));
            lisa (uus õpilane ("Dan", 0));
}};

ArrayList  firstList = uus ArrayList <> ();
ArrayList  secondList = uus ArrayList <> ();

jaoks (Üliõpilane: õpilased) {
            tõeväärtus onFirstFilled = firstList.size ()> = 3;
            boolean isSecondFilled = secondList.size ()> = 2;

            if (isFirstFilled && isSecondFilled) break;
            int mark = student.getMark ();
            if (märgi == 0 &&! on esmakordselt täidetud) {
                firstList.add (õpilane);
            } else if (märgi == 1 &&! isSecondFilled) {
                secondList.add (õpilane);
            }
        }