Зарегистрируйтесь, чтобы продолжить обучение

Пары Java: Составные данные

Мы уже написали несколько полезных функций для работы с точками и, в принципе, поняли, как работает эта абстракция. Теперь пришло время копнуть на уровень глубже и посмотреть, как же устроены наши точки.

import static Pair.cons;
import static Pair.car;
import static Pair.cdr;

// Конструктор
var pair = cons(8, 7);

car(pair); // 8
cdr(pair); // 7

var pair2 = cons(3, pair);

Устроены они достаточно просто и используют структуру данных, которая называется парой. Пар в самом языке Java не существует, мы их реализовали с помощью отдельной библиотеки, и выше можно увидеть пример того, как они используются. Мы подключаем из библиотеки конструктор cons и селекторы car и cdr. Конструктор создает пару, а селекторы служат для извлечения из пары первого значения (с помощью car) и второго значения (с помощью cdr). Всё достаточно просто и очень похоже на реализацию точек из прошлого урока.

Что интересно, элементами пары могут быть другие пары. В будущем это даст нам очень мощные возможности для того, чтобы строить более сложные структуры данных, в том числе списковые.

Давайте посмотрим, как представлены наши точки с помощью пар:

import static Pair.cons;
import static Pair.car;
import static Pair.cdr;
import static Pair.pairToString;

public static Pair makePoint(double x, double y) {
    return cons(x, y);
}

public static double getX(Pair point) {
    return getDoubleValue(car(point));
}

public static double getY(Pair point) {
    return getDoubleValue(cdr(point));
}

public static String pointToString(Pair point) {
    return pairToString(point);
}

Здесь всё предельно просто: makePoint — это функция, которая принимает x и y и вызывает конструктор пары с этими аргументами. То же самое с селекторами: getX и getY принимают на вход точку и вызывают с этой точкой car и cdr соответственно. Реализацию функции getDoubleValue не выводим, чтобы не перегружать лишней информацией. Скажем только что она численные значения переводит в Double, а любые другие элементы заменяет на 0. Это необходимо, т.к. аргументами могут быть пары с произвольными значениями, а не только с числами.

Теперь, используя пары, мы можем создавать новые абстракции, расширяя нашу библиотеку графических примитивов. Мы вводим понятие отрезка, для которого мы создаём конструктор и селекторы:

var point1 = makePoint(1, 2);
var point2 = makePoint(10, -2);

var segment = makeSegment(point1, point2);

startSegment(segment); // (1, 2)
endSegment(segment);   // (10, -2)

Нам нужно сделать две точки (потому что любой отрезок представлен двумя точками). После этого мы используем конструктор makeSegment и передаём туда наши точки, а с помощью селекторов startSegment и endSegment мы получаем точки. Важно, что мы получаем именно точки, потому что это тоже составные данные со своими селекторами, с помощью которых можно получать примитивные значения и производить над ними какие-либо манипуляции при необходимости.


Пары

Обратите внимание на то, что пары неизменяемы. Нельзя просто так взять и изменить пару. Можно только создать новую на основе предыдущей. Поначалу такой способ программирования может показаться необычным и сложным, так как надо перестроить своё мышление. Чем дальше вы будете продвигаться по курсам, тем больше он вам начнёт нравиться. Вы увидите, как часто упрощается код и его отладка в отсутствие изменяемости.


Дополнительные материалы

  1. История возникновения cons/car/cdr

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»