JSR 335 или lambda-выражения в JAVA 8

от автора

Введение

Посетил вчера семинар по 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/

ссылка на оригинал статьи http://habrahabr.ru/post/155191/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *