Kotlin Vs Java: Основни синтаксични разлики

Kotlin е наистина обещаващ език и всички говорят за него и казват, че е готино. Но защо е толкова специална?

Ще обсъдим как Котлин се различава от Java по отношение на синтаксиса, използваемостта, производителността на потребителския интерфейс.

Разлика в синтаксиса

1) Можете да направите повече с по-малко код

Едно от основните предимства на Kotlin е неговата ефикасност. Получавате повече функционалност с по-малко код. И колкото по-малко код пишете, толкова по-малко грешки правите

публичен финален клас Лице {
    частно име на низ;
    частна възраст;
    частна височина на поплавъка;

    обществено лице (Име на низ, инт. възраст, височина на поплавък) {
        this.name = име;
        this.age = възраст;
        this.height = височина;
    }

    обществено лице (Име на струна, възраст) {
        this.name = име;
        this.age = възраст;
        тази височина = 1.8f;
    }

    public String getName () {
        име за връщане;
    }

    public void setName (Име на низ) {
        this.name = име;
    }

    public int getAge () {
        възраст за връщане;
    }

    public void setAge (int age) {
        this.age = възраст;
    }

    public float getHeight () {
        възвратна височина;
    }

    public void setHeight (поплавкова височина) {
        this.height = височина;
    }

    @Override
    public String toString () {
        връщане "Лице {" +
                "name = '" + име +' \ '' +
                ", age =" + възраст +
                ", височина =" + височина +
                '}';
    }

    @Override
    публични булеви равни (обект о) {
        ако (това == о) върнете вярно;
        ако (o == null || getClass ()! = o.getClass ()) върне невярно;

        Лице лице = (Лице) o;

        ако (age! = person.age) се върне невярно;
        ако (Float.compare (person.height, height)! = 0) върне невярно;
        връщане на име! = null? name.equals (person.name): person.name == null
    }

    @Override
    public int hashCode () {
        int резултат = име! = null? name.hashCode (): 0;
        резултат = 31 * резултат + възраст;
        резултат = 31 * резултат + (височина! = + 0,0f? Float.floatToIntBits (височина): 0);
        възвратен резултат;
    }
}

Над една от тях е, както обикновено, Java клас със сетери и геттери. Нека разгледаме как можем да внедрим в Котлин

личност от клас данни (var име: String,
                 вар възраст: Int,
                 вар височина: Float = 1.8f)

Да, автоматично ще получите нужни функции getters, setters, equals (), hashcode (), toString () и copy () функции за вашия клас данни! Разбира се, можете лесно да отмените тези функции, но в повечето случаи е достатъчно само да декларирате класа и неговите свойства.

2) избягвайте NullPointerException

val човек: Лице? = нула
лице? .name = "Джон"

Ако променливата е нулируема, компилаторът няма да ви позволи да получите достъп до нея без подходяща проверка. Kotlin ви принуждава да използвате ?. оператор. Това не позволява приложението да се срине автоматично.

3) Можете да се отървете от утилитите

Всеки проект трябва да има класове util. Имали ли сте някога проект без тях?

Kotlin има интелигентно решение - функции за разширение - за да ви помогне да се отървете от всичките си класове на полети веднъж завинаги.

Функцията за разширение е почти обичайна функция на Kotlin. Но когато го декларирате, трябва да посочите класа, чиито екземпляри ще имат функцията за разширение.
fun Context.toast (текст: String) = Toast.makeText (това, текст, Toast.LENGTH_SHORT) .show ()

Забележете „това“, което предаваме като параметър на метода makeText ()? Това не е екземпляр от класа, в който декларираме тази функция, а е инстанция от контекст. И сега можете да се обадите на тази функция директно от вашата дейност или от всеки друг случай на контекст. Например:

тост ( "Hi")

4) Забравете за обвързването на изгледа

Спомняте ли си метода findViewById () ()? Сигурни сме, че не ви харесва. Не сме и двете. Също така не искаме да декларираме пояснения за променливи и Butterknife за всеки изглед, до който трябва да имаме достъп.

Можете да забравите за обвързването на изгледа с Kotlin Android Extensions. Вече не е необходимо да създавате променливи и да свързвате изгледи. Можете да получите достъп до своите изгледи директно с техните идентификатори, декларирани в xml оформлението.

MainActivity в обществен клас разширява AppCompatActivity {
    @Override
    защитена void onCreate (@Nullable Bundle saveInstanceState) {
        super.onCreate (savedInstanceState);
        setContentView (R.layout.activity_main);

        Бутон за бутон = (Бутон) findViewById (R.id.button);
        окончателен TextView текст = (TextView) findViewById (R.id.text);
        button.setOnClickListener (нов View.OnClickListener () {
            @Override
            публична невалидност onClick (View v) {
                text.setText ("Кликнахте върху бутон");
            }
        });
    }
}

клас MainActivity: AppCompatActivity () {

    замени забавлението onCreate (saveInstanceState: Bundle ?, persistentState: PersistableBundle?) {
        super.onCreate (saveInstanceState, persistentState)
        setContentView (R.layout.activity_main)

        button.setOnClickListener {text.text = "Кликнахте върху бутон"}
    }
}

5) Работете с колекции много по-лесно

Сега дни, във всеки проект трябва да извършваме трудни операции с колекции от модели данни.

Например, може да имаме списък с ученици, от които трябва да извлечем трима ученици с A оценки и двама студенти с B оценки.

Вижте решението в Котлин:

var students = listOf (Студент ("Джон", 0), Студент ("Джулия", 2), Студент ("Мат", 1),
                Студент ("Кейти", 0), студент ("Дан", 0))

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

Ето как бихме решили същия проблем в Java:

ArrayList  students = нов ArrayList  () {{
            добавяне (нов Студент ("Джон", 0));
            добавяне (нов Студент („Джулия“, 2));
            добавяне (нов Студент („Мат“, 1));
            добавяне (нов Студент („Кейти“, 0));
            добавяне (нов Студент („Дан“, 0));
}};

ArrayList  firstList = нов ArrayList <> ();
ArrayList  secondList = нов ArrayList <> ();

за (Студентски студент: студенти) {
            boolean isFirstFilled = firstList.size ()> = 3;
            boolean isSecondFilled = secondList.size ()> = 2;

            ако (isFirstFilled && isSecondFilled) почивка;
            int mark = student.getMark ();
            ако (маркирайте == 0 &&! isFirstFilled) {
                firstList.add (студент);
            } else if (маркирайте == 1 &&! isSecondFilled) {
                secondList.add (студент);
            }
        }