Освой Java играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Java 8

Наконец-то появилась поддержка Java 8. С чем его едят?

Android всегда запаздывала с поддержкой новых версий Java. Когда уже была Java 7, официально поддерживалась версия Java 6, хотя многие пользовались седьмой версией на свой страх и риск. В целом проблем не было, если не использовались некоторые специфические новинки. Затем поддержку седьмой версии подтвердили официально.

Та же история повторяется с версией Java 8.

Убедитесь, что у вас установлена Java 8. Если вы устанавливали Android Studio с нуля, начиная с версии 2.2, то по умолчанию студия устанавливает в своей папке jre специальную версию OpenJDK, которая является альтернативой JDK от Oracle. Вы можете использовать любые из этих версий, хотя рекомендуется использовать первый вариант.

Создаём новый проект. В build.gradle проекта в секцию android добавляем новый блок.


compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

Также можно это сделать через настройки студии в меню File | Project Structure, используя раздел app. На вкладке Properties установите версии 1.8 для опций Source Compatibility и Target Compatibility.

Теперь вы можете использовать новые возможности, предоставляемые Java 8.

Поддержка Java 8 не является полной. Подробнее можно посмотреть на странице https://developer.android.com/studio/write/java8-support.html#supported_features.

Новое в Java 8

default

Методы интерфейсов по умолчанию. Java 8 позволяет вам добавлять неабстрактные реализации методов в интерфейс, используя ключевое слово default.


interface Formula {
    double calculate(int a);

    default double sqrt(int a) {
        return Math.sqrt(a);
    }
}

Кроме абстрактного метода calculate() интерфейс Formula также определяет метод по умолчанию sqrt(). Классы, имплементирующие этот интерфейс, должны переопределить только абстрактный метод calculate(). Метод по умолчанию sqrt() будет доступен без переопределения.


Formula formula = new Formula() {
    @Override
    public double calculate(int a) {
        return sqrt(a * 100);
    }
};

formula.calculate(100);     // 100.0
formula.sqrt(16);                // 4.0

Predicate/Предикаты

Предикаты (predicate) — это функции-коты, принимающие один аргумент, и возвращающие значение типа boolean. Интерфейс содержит различные методы по умолчанию, позволяющие строить сложные условия (and, or, negate).


Predicate<String> predicate = (s) -> s.length() > 0;

predicate.test("foo");              // true
predicate.negate().test("foo");     // false

Predicate<Boolean> nonNull = Objects::nonNull;
Predicate<Boolean> isNull = Objects::isNull;

Predicate<String> isEmpty = String::isEmpty;
Predicate<String> isNotEmpty = isEmpty.negate();

Предикаты могут входить в состав метода в качестве параметра. Смотри пример метода ArrayList.removeIf().

Function/Функции

Функции принимают один аргумент и возвращают некоторый результат. Методы по умолчанию могут использоваться для построения цепочек вызовов (compose, andThen).


Function<String, Integer> toInteger = Integer::valueOf;
Function<String, String> backToString = toInteger.andThen(String::valueOf);

backToString.apply("123");     // "123"

Supplier/Поставщики

Поставщики (suppliers) предоставляют результат заданного типа. В отличии от функций, поставщики не принимают аргументов.


Supplier<Person> personSupplier = Person::new;
personSupplier.get();   // new Person

Consumer/Потребители

Потребители (consumers) представляют собой операции, которые производятся с одним входным аргументом.


Consumer<Person> greeter = (p) -> System.out.println("Hello, " + p.firstName);
greeter.accept(new Person("Luke", "Skywalker"));

Comparator/Компараторы

Компараторы хорошо известны по предыдущим версиям Java. Java 8 добавляет в интерфейс различные методы по умолчанию.


Comparator<Person> comparator = (p1, p2) -> p1.firstName.compareTo(p2.firstName);

Person p1 = new Person("John", "Doe");
Person p2 = new Person("Alice", "Wonderland");

comparator.compare(p1, p2);             // > 0
comparator.reversed().compare(p1, p2);  // < 0

Другое

Лямбда-выражения

Stream API

Optional

Date and Time API

Реклама