Проект Cactoos
Логотип:
Принципы проекта:
Инструменты и ресурсы:
Cactoos — это набор объектно-ориентированных примитивов Java.
Мотивация. Мы недовольны JDK, Guava и Apache Commons, потому что они процедурные, а не объектно-ориентированные. Они выполняют свою работу, но в основном через статические методы. Cactoos предлагает делать почти то же самое, но через объекты.
Принципы. Это принципы проектирования, лежащие в основе Cactoos.
Использование. У библиотеки нет зависимостей. Всё, что вам нужно, это (получите последнюю версию здесь):
Maven:
<dependency>
<groupId>org.cactoos</groupId>
<artifactId>cactoos</artifactId>
<version>0.55.0</version>
</dependency>
Gradle:
dependencies {
compile 'org.cactoos:cactoos::0.55.0
}
Требуется версия Java 1.8+.
Тег StackOverflow — cactoos.
Подробнее здесь: Объектно-ориентированный декларативный ввод/вывод в Cactoos.
Чтобы прочитать текстовый файл в UTF-8:
String text = new TextOf(
new File("/code/a.txt")
).asString();
Чтобы записать текст в файл:
new LengthOf(
new TeeInput(
"Hello, world!",
new File("/code/a.txt")
)
).value();
Чтобы считать двоичный файл из classpath:
byte[] data = new BytesOf(
new ResourceOf("foo/img.jpg")
).asBytes();
Чтобы отформатировать текст:
String text = new FormattedText(
"How are you, %s?",
name
).asString();
Чтобы манипулировать текстом:
// Чтобы перевести в нижний регистр
new Lowered(
new TextOf("Hello")
);
// Чтобы перевести в верхний регистр
new Upper(
new TextOf("Hello")
);
Подробнее здесь: Ленивая загрузка и кэширование с помощью липких примитивов Cactoos.
Чтобы фильтровать коллекцию:
Collection<String> filtered = new ListOf<>(
new Filtered<>(
s -> s.length() > 4,
new
``` ИтераблОф<>("привет", "мир", "чувак")
);
Чтобы сгладить один итерабельный:
новый Объединённый<>(
новый Отображенный<ИтераблОф>(
итер -> новый ИтераблОф<>(
новый СписокОф<>(итер).toArray(новое Целое число[]{})
),
новый ИтераблОф<>(1, 2, 3, 4, 5, 6)
)
); // Итерабл<Целое число>
Чтобы сгладить и объединить несколько итерабельных:
новый Объединенный<>(
новый Отображенный<ИтераблОф>(
итер -> новый ИтераблОф<>(
новое Объединение<>(итер)
),
новое Объединение<>(
новый ИтераблОф<(новый ИтераблОф<>(1, 2, 3)),
новый ИтераблОф<(новый ИтераблОф<>(4, 5, 6))
)
)
); // Итерабл<Целое число>
Чтобы перебрать коллекцию:
новое И(&)(
новое Отображенное<>(
новая ФункцияОф<>(
ввод -> {
Система.out.printf("Элемент: %s\n", ввод);
},
новая Правда()
),
новый ИтераблОф<>("как", "являются", "вы", "?")
)
).значение();
Или еще более компактно:
новое Для каждого<Строка>(
ввод -> Система.out.printf(
"Элемент: %s\n", ввод
)
).exec(новый ИтераблОф("как", "являются", "вы", "?"));
Чтобы отсортировать список слов в файле:
Список<Текст> отсортированный = новый СписокОф<>(
новый Отсортированный<>(
новое Отображенное<>(
текст -> новый СравнимыйТекст(текст),
новый Разделенный(
новый ТекстОф(
новый Файл("/tmp/names.txt")
),
новый ТекстОф("\\s+")
)
)
)
);
Чтобы подсчитать элементы в итерабельном:
int общее количество = новое ДлинаОф(
новый ИтераблОф<>("как", "являются", "вы")
).значение().intЗначение();
Создать набор элементов, предоставив переменные аргументы:
final Набор<Строка> уникальный = новый НаборОф<Строка>(
"один",
"два",
"один",
"три"
);
Создать набор элементов из существующего итерабельного:
final Набор<Строка> слова = новый НаборОф<>(
новый ИтераблОф<>("abc", "bcd", "abc", "ccc")
);
Создать отсортированный итерабельный с уникальными элементами из существующего итерабельного:
final Итерабл<Строка> отсортированный = новый Отсортированный<>(
новый НаборОф<>(
новый ИтераблОф<>("abc", "bcd", "abc", "ccc")
)
);
Создать отсортированный набор из существующих переменных аргументов элементов с использованием компаратора:
final Набор<Строка> отсортированный = новый org.cactoos.set.Отсортированный<>(
(первый, второй) -> первый.compareTo(второй),
"abc", "bcd", "abc", "ccc", "acd"
);
Создать отсортированный набор из существующего итерабельного с использованием компаратора:
final Набор<Строка> отсортированный = новый org.cactoos.set.Отсортированный<>(
(первый, второй) -> первый.compareTo(второй),
новый ИтераблОф<>("abc", "bcd", "abc", "ccc", "acd")
);
Это традиционный цикл foreach:
для (Строковое имя : имена) {
Система.out.printf("Привет, %s!\n", имя);
}
Его объектно-ориентированная альтернатива (без потоков!):
new И(&)(
n -> {
Система.out.printf("Привет, %s!\n", n);
вернуть новую Правду().значение();
},
имена
).значение();
Бесконечный цикл while/do:
пока (!готово) {
Система.out.println("Все еще жду...");
}
Вот его объектно-ориентированная альтернатива:
new И(&)(
готово -> {
Система.out.println("Все еще жду...");
вернуть !готово;
},
new Бесконечный<>(логический параметр)
).значение();
Из нашего пакета org.cactoos.time
.
Наши классы разделены на две группы: те, которые анализируют строки в объекты даты/времени, и те, которые форматируют эти объекты в строки.
Например, это традиционный способ анализа строки в объект OffsetDateTime:
окончательный OffsetDateTime дата = OffsetDateTime.parse("2007-12-03T10:15:30+01:00");
Здесь его объектно-ориентированная альтернатива (без статических вызовов методов!) с использованием OffsetDateTimeOf, который является Scalar:
окончательная дата OffsetDateTime = новая OffsetDateTimeOf("2007-12-03T10:15:30+01:00").значение();
Для форматирования OffsetDateTime в Text:
окончательное смещение даты = ...;
окончательная строка текста = new TextOfDateTime(дата).asString();
Cactoos | Guava | Apache Commons | JDK 8 |
---|---|---|---|
And | Iterables.all() | - | - |
Filtered | Iterables.filter() | ? | - |
FormattedText | - | - | Перевод на русский язык |
:--: | :--: | :--: | |
String.format() |
— | Строка.формат() |
|
IsBlank |
— | StringUtils.isBlank() |
— |
Joined |
— | — | Строка.join() |
LengthOf |
— | — | Строка#length() |
Lowered |
— | — | Строка#toLowerCase() |
Normalized |
— | StringUtils.normalize() |
— |
Or |
Iterables.any() |
— | — |
Repeated |
— | StringUtils.repeat() |
— |
Replaced |
— | — | Строка#replace() |
Reversed |
— | — | StringBuilder#reverse() |
Rotated |
— | StringUtils.rotate() |
— |
Split |
— | — | Строка#split() |
StickyList |
Lists.newArrayList() |
? | Массивы.asList() |
Sub |
— | — | Строка#substring() |
SwappedCase |
— | StringUtils.swapCase() |
— |
TextOf |
? | IOUtils.toString() |
— |
TrimmedLeft |
— | StringUtils.stripStart() |
— |
TrimmedRight |
— | StringUtils.stripEnd() |
— |
Trimmed |
— | StringUtils.stripAll() |
Строка#trim() |
Upper |
— | — | Строка#toUpperCase() |
Задайте свои вопросы, связанные с библиотекой Cactoos, на Stackoverflow с тегом cactoos.
Просто разветвите репозиторий и отправьте нам запрос на перенос.
Убедитесь, что ваша ветка собирается без каких-либо предупреждений или проблем:
mvn clean verify -Pqulice
Чтобы запустить сборку, аналогичную CI с Docker, используйте:
docker run \
--tty \
--interactive \
--workdir=/main \
--volume=${PWD}:/main \
--volume=cactoos-mvn-cache:/root/.m2 \
--rm \
maven:3-jdk-8 \
bash -c "mvn clean install site -Pqulice -Psite --errors; chown -R $(id -u):$(id -g) target/"
Чтобы удалить кэш, используемый сборкой на основе Docker:
docker volume rm cactoos-mvn-cache
Примечание: Checkstyle используется в качестве инструмента статического анализа кода с списком проверок в предварительных коммитах GitHub.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )