Рубрики
Без рубрики

Сила кортежей

Кортежи на Java. С пометкой java, lang, для начинающих, учебное пособие.

Все инженеры Java знают о классах, в частности о POJO. Мы пишем POJO каждый раз, когда нам нужен какой-то набор связанных именованных переменных.

Tuple – это структура данных, которая очень похожа на Java POJO – она содержит несколько переменных с соответствующими типами. Разница в том, что Кортеж содержит неназванные значения, в отличие от POJO. Кортеж также похож на массивы, за исключением того, что элементы могут иметь разные типы и правильно реализованы Кортеж должен сохранять эти типы.

Кортеж часто реализуется как Монада , т.е. нет средств доступа и, следовательно, нет способа получить один элемент. На самом деле нет большого смысла иметь аксессуары для Tuple . Поскольку элементы не имеют имен, средства доступа будут работать с порядковыми номерами элементов, что подвержено ошибкам и неудобно.

К счастью Монадная реализация на основе Кортеж позволяет обеспечить удобный способ доступа ко всем элементам сразу (и даже присвоить этим элементам произвольные имена) – map() метод, который принимает лямбда-выражение с числом параметров, равным Кортеж размер.

Приведенный ниже небольшой пример показывает, как это выглядит:

final var tuple = Tuple.with(10, "some string", UUID.randomUUID());

tuple.map((integer, string, uuid) -> System.out.printf("Received: %d, %s, %s", integer, string, uuid));

Лямбда-выражение, вызываемое map() , имеет доступ ко всем компонентам одновременно и может выдавать произвольный результат. Обратите внимание, что если существует POJO, в котором есть конструктор all-args с соответствующим порядком параметров, Tuple может быть преобразован в POJO за один шаг:

public class SimplePojo {
   private final Integer intValue;
   private final String stringValue;
   private final UUID uuidValue;

   public SimplePojo(final Integer intValue, final String stringValue, final UUID uuidValue) {
      ...
   }
   ...
}
...
final var tuple = Tuple.with(10, "some string", UUID.randomUUID());

final var pojo = tuple.map(SimplePojo::new);

Конечно, фабричный метод тоже будет работать.

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

Другая область – возврат нескольких значений из вызова метода. Здесь Кортеж особенно удобен – map() позволяет деструктурирование очень похоже на языки, в которые встроена эта функция:

   ...
   Tuple3 parseParameters(final Request request);
   ...
   Result serveRequest(final Integer count, final String message, final UUID userId);
   ...

   return parseRequest(request)
            .map((count, message, uuid) -> serveRequest(count, message, uuid));

Ядро Реактивного инструментария использует Кортеж в случаях, когда несколько результатов должны быть сгруппированы вместе, например, когда есть необходимость вернуть результат ожидания нескольких Обещание должно быть решено:

 Promise> all(final Promise promise1,
                                             final Promise promise2,
                                             final Promise promise3);

Описанный выше метод будет ждать разрешения 3 Обещание ‘s а затем верните все значения в одном кортеже с 3 элементами.

Оригинал: “https://dev.to/siy/the-power-of-tuples-2cf4”