Все инженеры 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()
позволяет деструктурирование очень похоже на языки, в которые встроена эта функция:
... Tuple3parseParameters(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”