Введение
Посетил вчера семинар по lambda-выражениям в JAVA 8. Рассказали много интересного.
Из интересностей:
lambda-выражения
Comparator<Integer> cmp = (x, y) -> (x < y) ? -1 : (x > y) ? 1 : 0;
Слева обязательный интерфейс, определяющий lambda. Справа выражение. Левая часть от "->" это сигнатура, правая — реализация.
Эта конструкция заменяет громоздкий код:
Comparator<Integer> comparator = new Comparator<Integer> () {
public int compare(Integer x, Integer y) {
return (x < y) ? -1 : (x > y) ? 1 : 0;
}
};
lambda-выражения могут имплементировать любой функциональный интерфейс.Функциональный интерфейс — это интерфейс с одним абстрактным методом (об этом ниже). Также добавится куча полезных интерфейсов вроде Factory.make, Mapper.map. Ну и еще множество гибких возможностей использования и применения.
Также есть возможность вместо ручного описания лямбды брать ее реализацию из других классов:
Comparator<Integer> comparator = LibraryComparator::compare; // Некая реализация из библиотеки
Расширение интерфейсов default-методами (defender)
Да, теперь методы интерфейса делятся на абстрактные (не имеют реализации) и не абстрактные (default), которые имеют некую дефолтную реализацию. Это нововведение признано упростить расширение интерфейсов базовых сущностей JAVA, да и вообще любых интерфейсов с поддержкой совместимости. Например, имеется старый интерфейс:
public interface OldInterface {
void method();
}
Нам его надо расширить, но чтобы старый код продолжил работать. Добавим default-метод:
public interface OldInterface {
void method();
void newMethod() default {
// default implementation
}
}
Писать или не писать слово default в интерфейсах — обсуждается.
Stream (bulk) операции
Классная штука, позволяющая гораздо гибче работать с коллекциями. Например, абстрактный пример в вакууме:
list.stream().parallel().sort(comparator).filter(Math::max).into(newList);
Попытались параллельно отсортировать коллекцию с указанным компаратором (может быть lambda), затем отфильтровали максимальный элемент и поместили это значение(-я) в другой список.
Подробнее о новых фишках: http://openjdk.java.net/projects/lambda/
О новых встречах: http://jug.ru/
Автор: VaiMR