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

в 7:09, , рубрики: bulk, java, java8, lambda, Stream, разработка, метки: , , ,

Введение

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

Поделиться

* - обязательные к заполнению поля