С выходом Java 8 мы можем по-новому взглянуть на устаревшие обычные обычные объекты Java (или сокращенно «POJO») и работать с ними совершенно по-новому. Приятного чтения!

Рассмотрим следующий простой класс, моделирующий город:

мы можем легко создать такие города:

Это все старая школа, но что такое геттер и сеттер в функциональном контексте Java 8?
Как можно моделировать различные конструкторы в Java 8?

Функциональный взгляд на геттеры

Геттер — это то, что может взять POJO и преобразовать его во что-то другое.
Это соответствует функции Java 8. Отлично!!…
В нашем примере с городом метод получения getName() соответствует элементу Java 8 Function‹City, String›, поскольку метод получения принимает объект City и превращает его в строку. Другими словами, он сопоставляет City со строкой.
Мы можем легко доказать наш постулат с помощью следующего фрагмента кода:

The code for San Francisco is SF

Итак, теперь вы можете использовать функцию вместо прямого вызова геттера.
Это может быть очень полезно, когда вы хотите программно использовать различные геттеры в своем коде, например, предоставляя геттер как функцию в вызываемых вами методах.
Он также удобен тем, что позволяет использовать методы программно, не прибегая в некоторых случаях к рефлексии.

Функциональный вид сеттеров

Функциональное представление для сеттеров немного сложнее, чем для геттеров.
На самом деле мы используем два параметра: сам POJO и некоторое значение, которое мы хотим установить в POJO.
В отличие от геттера, мы не хотим ничего возвращать. В Java 8 можно использовать нечто, называемое BiConsumer.
Как следует из его префикса, BiConsumerпринимает два параметра и "использует" их оба, то есть они "проглатываются", так что ничего не возвращается.
Опять же, мы можем очень легко проверить этот тезис следующим образом:

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

Функциональный вид конструкторов

Создание объектов в Java иногда считают «магией», но на самом деле в конструкторе нет ничего особенного с функциональной точки зрения.
Конструктор — это что-то вроде функции, которая принимает все, от нуля до множества параметров, и создает объект.

Конструктор по умолчанию

В нашем примере было два конструктора, и теперь мы начнем с конструктора по умолчанию City().
Очевидно, что конструктор создает город без использования каких-либо параметров. В контексте Java 8 это действительно поставщик, а точнее, поскольку он снабжает города, он является поставщиком‹городом›.
Опять же, мы можем доказать это утверждение, попробовав этот простой код:

Отлично! Теперь мы можем создавать различные объекты, используя простые ссылки на конструктор.
Очень полезно в коде динамического программирования, когда вы не знаете тип объекта, который хотите создать, пока не запустите свой код.
Обратите внимание, как мы получаем ссылку на метод для конструктора, используя ссылку ::new.

Конструкторы параметров

Теперь это становится немного сложнее. Конструктор, который принимает параметры, — это больше, чем просто поставщик, потому что ему нужны входные параметры, прежде чем объект может быть создан.
В нашем примере у нас есть конструктор с двумя параметрами, поэтому мы можем использовать из Java 8. БиФункция.
BiFunctionпринимает два параметра и может возвращать что-то еще, потенциально зависящее от этих двух параметров.
Поскольку наш конструктор City принимает две строки, мы хотим использовать BiFunction‹String, String, City›, что означает, что мы берем две строки и сопоставляем их с a City.
Опять же, мы собрали код, чтобы показать концепцию:

Но подожди там!

Мы использовали одну и ту же ссылку на метод City::new как для конструктора по умолчанию без параметров, так и для конструктора с двумя параметрами, и все же Java 8 может различать их!

Как City::new может иметь два разных значения?
Ответ заключается в том, что Java 8 может сделать вывод о том, какой конструктор следует выбрать, потому что она может сопоставлять различные конструкторы с ожидаемым результатом.
Поскольку нам нужна BiFunction, она понимает, что должна возвращать ссылку на метод конструктора с двумя параметрами, а не конструктор по умолчанию без параметров!

Кратко

В этом посте мы разработали способ получения полнофункционального представления POJO. Освоив эти приемы, вы сможете вдохнуть новую жизнь в свои старые POJO и код Java 8.

Удачи вам в ваших функциях!

Спасибо за уделенное время. Надеюсь, вы получили для себя что-то интересное и получили удовольствие от чтения.

Давайте поддерживать связь! Подпишитесь на мою еженедельную рассылку

❤ Если вам понравился этот пост, вам также могут понравиться: