Статьи Генератор паролей UUID MD5 Unix-время URL-encode Base64 Форматирование XML Ваш внешний IP Число прописью


Статьи с тэгом «Collections»

Сравнение форматов конфига в Spring Boot

16 февраля 2020

Тэги: Spring Boot Java Collections Spring

Spring Boot позволяет хранить настройки приложения в файле и получать к ним доступ в декларативном стиле. Этот файл может иметь один из трёх форматов: properties, xml и yaml. Как Spring будет интерпретировать формат файла, определяется его расширением. Далее мы рассмотрим плюсы и минусы каждого формата. В качестве примера предположим, что в конфиге мы храним число, текстовую строку на русском языке и список значений.

properties-файл

По умолчанию в Spring используется properties-конфиг. Имя файла должно начинаться со слова application и иметь расширение properties. Если вы не используете профили для разделения конфигов, то достаточно иметь файл application.properties.

# числовой параметр
some.test.numberValue=42
# текстовый параметр
some.test.textValue="Текстовый параметр из properties-файла"
# список значений
some.test.list[0]=one
some.test.list[1]=two
some.test.list[2]=three

В данном формате комментарии всегда начинаются с новой строки и с символа «#». Имя каждого параметра прописывается полностью (и это один из недостатков данного формата), затем идёт «=», затем само значение. Текстовые значения можно указывать как в кавычках, так и без них. Список значений, который в нашем приложении превратится в объект типа List, в конце имени каждого значения имеет индекс в квадратных скобках. Такой синтаксис похож на объявление массива.

Читать полностью...

Коллекции: очередь и стек

16 апреля 2019

Тэги: Collections Java

Ранее мы рассматривали наиболее популярные Коллекции в Java. В данной статье рассмотрим чуть более специфичные коллекции. Все рассмотренные ниже коллекции реализуют один из двух алгоритмов манипулирования данными: «First In - First Out» (FIFO) и «Last In - First Out» (LIFO).

Очередь

Очередь реализует принцип «first in - first out», т.е. «первым пришёл - первым ушёл». Базовым интерфейсом всех очередей Java является Queue. Добавление элементов в очередь делается методом add(), удаление - poll(), получение первого элемента без его удаления - peek().

Две самые простые реализации очереди - это LinkedList и PriorityQueue. Рассмотрим их на примере.

Queue<String> queue = new LinkedList<>();
queue.add("банан");
queue.add("яблоко");
queue.add("ананас");
while (queue.peek() != null) { // или !queue.isEmpty()
    System.out.println(queue.poll());
}
Читать полностью...

Терминальные операции Stream API

8 апреля 2019

Тэги: Java 8 Collections Stream API

Ранее мы уже рассмотрели Промежуточные операции Stream API, а сейчас рассмотрим терминальные (конечные).

Промежуточные операции следует воспринимать как «отложенные», т.е. они не меняют сами данные, а только задают правила их изменения. А терминальные как раз инициируют всю цепочку преобразований, закрывают поток и возвращают модифицированные данные. Закрытый поток повторно использовать нельзя.

Преобразование в коллекцию

Самая распространённая терминальная операция collect(). Результатом может быть, например, список.

List<String> fruits = Stream.of("apple", "banana", "lemon", "orange")
        // здесь могут быть ещё какие-то преобразования
        .collect(Collectors.toList());

А можно преобразовать стрим из строк в мапу, причём ключом сделать первую букву соответствующего слова:

Map<String, String> fruits = Stream.of("apple", "banana", "lemon", "orange")
        .collect(Collectors.toMap(e -> e.substring(0, 1), e -> e));
        // {a=apple, b=banana, l=lemon, o=orange}
Читать полностью...

Промежуточные операции Stream API

7 апреля 2019

Тэги: Stream API Java 8 Collections

Все методы Stream API можно разделить на две группы: промежуточные и терминальные (конечные). Промежуточные операции следует воспринимать как «отложенные», т.е. они не меняют сами данные, а только задают правила их изменения. А терминальные как раз инициируют всю цепочку преобразований и возвращают модифицированные данные.

Рассмотрим промежуточные операции. Все промежуточные операции возвращают типизированный интерфейс Stream<>.

Преобразование

Любое изменение исходного элемента можно делать с помощью метода map(). В качестве параметра метод принимает лямбда-выражение.

Stream.of(1, 2, 3, 4, 5, 6)
        .map(n -> n * 10) // умножает каждый элемент на 10
Stream.of("apple", "orange")
        .map(String::toUpperCase) // преобразует буквы в каждом слове в верхний регистр

Во втором случае мы воспользовались краткой записью лямбда-выражения через method reference.

Читать полностью...

Коллекции: list, set, map

8 мая 2018

Тэги: Java Collections

Под коллекциями в программировании подразумевают объекты, которые хранят внутри себя какой-либо набор значений и предоставляют набор методов для обращения к этим значениям. В Java можно выделить 3 наиболее часто используемых типа коллекций: списки (list), наборы (set) и словари (map). При объявлении коллекции типизируются каким-либо типом, т.е. одна коллекция хранит данные одного типа.

Список (list)

Списки в Java реализуют интерфейс List, который, в свою очередь, расширяет интерфейс Collection. Список позволяет хранить любые значения, в том числе повторяющиеся. Итерация (обход) списка происходит в порядке добавления элементов. Т.е. элемент, добавленный первым, при итерации также будет первым.

List<String> list = new ArrayList<>();
list.add("яблоко");
list.add("ананас");
list.add("яблоко");
System.out.println(list); // На экране увидим: [яблоко, ананас, яблоко]

Две наиболее частые реализации интерфейса List - это ArrayList и LinkedList.

Читать полностью...

Удобные методы работы с Map

29 апреля 2018

Тэги: Java 8 Collections

В Java 8 базовый интерфейс Map расширился новыми полезными методами. На конкретных примерах я покажу, как приходилось работать с этим типом коллекций раньше, и как легко с ним стало работать теперь.

Обход всей коллекции в цикле

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

for (Map.Entry<String, String> entry : map.entrySet()) {
    System.out.println(entry.getValue());
}

В java 8 появился метод foreach(), который принимает лямбда-функцию из двух параметров: ключ и значение. Указанный выше код можно записать одной строкой:

map.forEach((k, v) -> System.out.println(v));
Читать полностью...

Stream API

28 апреля 2018

Тэги: Java 8 Stream API Collections

В Java 8 появилось довольно важное нововведение под названием Stream. И здесь имеются в виду не потоки ввода/вывода. Stream - это абстракция, позволяющая с любыми объектами работать как с потоками данных. Порой это чем-то похоже на выполнение запросов к БД. Рассмотрим несколько типовых задач, с которыми часто сталкивается каждый разработчик.

Объединение нескольких строк в одну

Наверняка вам приходилось генерить одну строку из нескольких других, разделённых запятыми. При этом после последнего элемента запятой быть не должно. Знакомо? В java 8 это делается так:

Stream.of("Linux", "Windows", "Mac")
    .collect(Collectors.joining(", ")));

Мы создаём новый поток из простых строк, а затем собираем их в одну при помощи метода collect(). В результате получим следующую строку:

Читать полностью...

Генерация случайных чисел при помощи Stream API

10 января 2018

Тэги: Java 8 Collections Stream API

В Java 8 у класса java.util.Random появился набор удобных методов для генерации стримов (Stream) случайных чисел для всех основных числовых типов. Например:

private List<Integer> randomIntsGenerator() {
    return new Random()
            .ints(25, 1, 6)
            .boxed()
            .collect(Collectors.toList());
}
Читать полностью...

Простой способ создания коллекций в Java 9

4 января 2018

Тэги: Java 9 Collections

Java 9 предоставляет новый способ создания read-only коллекций при помощи стандартных универсальных методов List.of(), Set.of() и Map.of().

Например, если мы хотим создать список строк, представляющих собой дни недели, то он будет выглядеть так:

List<String> days = List.of(
                "понедельник",
                "вторник",
                "среда",
                "четверг",
                "пятница",
                "суббота",
                "воскресенье");

При этом при попытке модифицировать полученную коллекцию (например, добавить новый элемент) вы получите ошибку, т.к. в данном случае вы работаете с неизменямой коллекцией.

Читать полностью...

Генерация N одинаковых элементов через Stream API

4 января 2018

Тэги: Java 8 Stream API Collections

Предположим, вы хотите сгенерировать N одинаковых элементов. Это очень легко сделать в Java при помощи Stream API. Рассмотрим следующий метод:

private List<String> repeatedValueGenerator(String text, int count) {
    return Stream.generate(() -> text)
            .limit(count)
            .collect(Collectors.toList());
}
Читать полностью...

Далее ❯