Ревью 7. Ревью 7 - Функциональные Интерфейсы, Streams. Чем является Stream в контексте Java 3 Для чего нужен 3
Скачать 84.11 Kb.
|
Что такое лямбда? Как взаимосвязаны лямбда и функциональный интерфейс?Лямбда-выражение или просто лямбда в Java — упрощённая запись анонимного класса, реализующего функциональный интерфейс. Лямбда-выражение представляет сокращенную запись анонимного класса. ShapeService rectangleService = new ShapeService() { @Override public double perimeter(double a, double b) { return 2 * (a + b); } }; Эволюция в лямбда начинается с того, что опускается конструктор анонимного класса и имя метода интерфейса. Так как метод единственный в интерфейсе, то и его имя можно не упоминать. Параметры метода отделяются от тела метода оператором «стрелка»: ShapeService rectangleService = (double a, double b) -> { return 2 * (a + b); }; Если тело метода состоит из одного оператора, то и фигурные скобки можно опустить. ShapeService rectangleService = (double a, double b) -> 2 * (a + b); Типы параметров метода также можно опустить, так как предполагается, что они известны из сигнатуры единственного абстрактного метода. ShapeService rectangleService = (a, b) -> 2 * (a + b); Применение лямбда-выражений становится возможным только для функциональных интерфейсов из-за единственного абстрактного метода, так как исчезает необходимость явно указывать имя метода. Может ли лямбда-выражение быть в несколько строк?Да. В данном случае тело после -> должно обрамляться фигурными скобками {}, каждая строчка заканчиваться точкой с запятой. Если лямбда-выражение возвращает результат, ключевое слово return также требуется. К каким переменным и как можно обращаться в теле лямбда-выражений?Доступ к переменным внешней области действия из лямбда-выражения очень схож к доступу из анонимных объектов. Можно ссылаться на: неизменяемые (r - не обязательно помеченные как final) локальные переменные; поля класса; статические переменные. К методам по умолчанию реализуемого функционального интерфейса обращаться внутри лямбда-выражения запрещено. Как отсортировать список строк с помощью лямбда-выражения?public static List Collections.sort(list, (a, b) -> a.compareTo(b)); return list; } Какова цель метода filter() в стримах?Метод filter() является промежуточной операцией принимающей предикат, который фильтрует все элементы, возвращая только те, что соответствуют условию. Для чего в стримах предназначен метод limit()?Метод limit() является промежуточной операцией, которая позволяет ограничить выборку определенным количеством первых элементов. Для чего в стримах предназначен метод sorted()?Метод sorted() является промежуточной операцией, которая позволяет сортировать значения либо в натуральном порядке, либо задавая Comparator. Порядок элементов в исходной коллекции остается нетронутым - sorted() всего лишь создает его отсортированное представление. Для чего в стримах предназначены методы flatMap(), flatMapToInt(), flatMapToDouble(), flatMapToLong()?Метод flatMap() похож на map, но может создавать из одного элемента несколько. Таким образом, каждый объект будет преобразован в ноль, один или несколько других объектов, поддерживаемых потоком. Наиболее очевидный способ применения этой операции — преобразование элементов контейнера при помощи функций, которые возвращают контейнеры. Stream .of("H e l l o", "w o r l d !") .flatMap((p) -> Arrays.stream(p.split(" "))) .toArray(String[]::new);//["H", "e", "l", "l", "o", "w", "o", "r", "l", "d", "!"] flatMapToInt(), flatMapToDouble(), flatMapToLong() - это аналоги flatMap(), возвращающие соответствующий числовой стрим. |