JTuple — это тип данных «кортеж» для языка Java, который реализует характеристики кортежей (неизменяемость и возможность итерирования), а также часто используемые методы операций.
Основная цель кортежа — представлять несколько значений. Часто возникает необходимость вернуть группу значений, причём типы этих значений могут быть разными. Например, при HTTP-запросе может потребоваться вернуть код ответа (int) и ответное сообщение (String).
Для разработчиков на Java в такой ситуации обычно создают класс с двумя свойствами, соответствующими двум значениям, и возвращают его вызывающей стороне. Это может показаться утомительным и неэффективным.
Другой вариант — вернуть список, но из-за разных типов элементов можно использовать только List, что ухудшает читаемость кода.
Кортежи были созданы для решения таких проблем. Многие современные языки программирования, такие как Python и Scala, имеют встроенные кортежи. Этот проект позволяет разработчикам на Java также воспользоваться преимуществами использования кортежей.
Класс | Описание |
---|---|
Tuple | Абстрактный класс для кортежей, реализующий структуру данных кортежа и часто используемые операции |
Tuple0 | Пустой кортеж без элементов |
Tuple1 | Кортеж с одним элементом |
Tuple2 | Кортеж с двумя элементами |
Tuple3 | Кортеж с тремя элементами |
Tuple4 | Кортеж с четырьмя элементами |
Tuple5 | Кортеж с пятью элементами |
TupleN | Кортеж с N элементами |
Tuples | Класс инструментов, предоставляющий элегантные способы использования кортежей |
Операция API | Описание |
---|---|
add | Объединение кортежей |
foreach | Итерация по кортежу |
forEachWithIndex | Итерация по кортежам с индексом |
reverse | Переворачивание кортежа |
toArray | Преобразование кортежа в массив |
toList | Преобразование кортежа в список |
get | Получение элемента из кортежа по индексу |
contains | Проверка наличия элемента в кортеже |
subTuple | Извлечение подкортежа |
equals | Сравнение содержимого двух кортежей на равенство |
toString | Вывод строкового представления кортежа, например (123, 456) |
repeat | Повторение всех элементов в кортеже заданное количество раз |
stream | Превращение кортежа в поток, аналогично List.stream |
parallelStream | Превращение кортежа в параллельный поток, аналогично List.parallelStream |
sort | Сортировка списка или массива кортежей |
// Статический импорт инструментального класса, затем начало элегантного использования кортежей
import static com.github.sd4324530.jtuple.Tuples.tuple;
// Чтение элемента по указанному индексу
Tuple2<String, Integer> tuple = tuple("test", 123);
log.debug("first:{}", tuple2.first);//test
log.debug("second:{}", tuple2.second);//123
// toString
Tuple4<String, Integer, Boolean, Double> tuple = tuple("test", 123, true, 186.5);
log.debug("tuple4:{}", tuple.toString());//(test, 123, true, 186.5)
// Итерация по кортежу
Tuple5<String, Integer, Boolean, Double, Character> tuple = tuple("test", 123, true, 186.5, 'A');
// Способ 1
tuple.forEach(o -> log.debug(Objects.toString(o)));
// Способ 2
for (Object object : tuple) {
log.debug(Objects.toString(object));
}
// Объединение кортежей
Tuple1<String> tuple1 = tuple("hello");
Tuple2<String, String> tuple2 = tuple("world", "!");
Tuple3<Integer, Integer, Integer> tuple3 = tuple(1, 2, 3);
log.debug("add:{}", tuple1.add(tuple2).toString());//(hello, world, !)
log.debug("add:{}", tuple1.add(tuple2, tuple3).toString());//(hello, world, !, 1, 2, 3)
// Переворот кортежа
Tuple4<String, Integer, Boolean, Double> tuple = tuple("hello", 123, true, 186.5);
log.debug("reverse:{}", tuple.reverse().toString());//(186.5, true, 123, hello)
// Повторение элементов кортежа
Tuple2<String, String> tuple2 = tuple("a", "b");
log.debug("repeat:{}", tuple2.repeat(3).toString());//(a, b, a, b, a, b)
// Извлечение подкортежа
TupleN tupleN = tuple(0, 1, 2, 3, 4, 5, 6);
log.debug("sub:{}", tupleN.subTuple(0, 3).toString());//(0, 1, 2, 3) **Пример использования кортежей**
1. **HTTP-запрос в обёртке:**
```java
public class HttpKit {
/**
* HTTP GET запрос
*
* @param url URL запроса
* @return результат запроса в виде кортежа, первый элемент — код ответа, второй — содержимое ответа, третий — исключение при неудачном запросе
*/
public Tuple3<Integer, String, Exception> get(String url) {
// отправка запроса и анализ результата
return null;
}
}
Обёртка для операций с базой данных:
public class DbKit {
import static com.github.sd4324530.jtuple.Tuples.tuple;
/**
* Выполнение SQL-запроса
*
* @param sql SQL-запрос
* @return кортеж результатов выполнения: первый элемент указывает на наличие исключения, если он равен null, то выполнение прошло успешно; второй элемент содержит результаты запроса
*/
public Tuple2<Exception, List<Object>> query(String sql) {
try (Connection connection = getConn(); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(sql)) {
List<Object> data = handleResult(resultSet);
return tuple(null, data);
} catch (Exception e) {
return tuple(e, null);
}
}
}
Импорт (JDK >= 1.8):
<dependency>
<groupId>com.github.sd4324530</groupId>
<artifactId>JTuple</artifactId>
<version>1.2.1</version>
</dependency>
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )