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


Список статей

Spring Boot: преобразование объекта в json

27 января 2020

Тэги: Spring Boot Java 10 rest

Spring Boot значительно упрощает преобразование объекта в json. Предположим, у нас есть такой класс, содержащий какую-то информацию о пользователе:

public class User {
    private String firstName;
    private String lastName;
    private int age;

   // далее идут get- и set-методы для указанных полей...
}

Создадим контроллер, который будет его возвращать.

@RestController
public class JsonController {

    @GetMapping
    public User getUser() {
        var user = new User();
        user.setFirstName("Сигизмунд");
        user.setLastName("Петров");
        user.setAge(23);
        return user;
    }
}

Этих двух классов достаточно, чтобы вы уже могли получать информацию о пользователе в формате json! Выполнив GET-запрос к вашему приложению (по умолчанию http://127.0.0.1:8080/), вы получите такой json:

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

Как получить все даты в указанном диапазоне

26 января 2020

Тэги: Java 8 Java 9 Stream API

Предположим, у нас есть дата начала dateTill и дата окончания dateFrom некоторого временного диапазона. И нам нужно получить список, содержащий все даты из этого диапазона. Как это сделать? Есть два варианта.

Вариант для Java 9

Если у вас Java версии 9 или более поздняя, то можно использовать такой лаконичный вариант:

public List<LocalDate> getDatesFromInterval(LocalDate dateFrom, LocalDate dateTill) {
    return dateFrom.datesUntil(dateTill.plusDays(1))
            .collect(Collectors.toList());
}

Метод LocalDate.datesUntil() порождает поток, начинающийся с указанной даты и заканчивающийся датой, переданной в этот метод в качестве параметра. Чтобы конечная дата также попала в выборку, прибавляем к ней ещё один день с помощью метода plusDays(). В конце превращаем этот поток в список, используя метод collect().

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

Вычисление размера директории

25 января 2020

Тэги: Java 8 алгоритмы Stream API

При работе с файловой системой может потребоваться вычислить размер папки (folder) с лежащими в ней файлами. Как известно, директория - это лишь логический раздел на файловой системе, поэтому её размер равняется сумме размеров всех файлов, находящихся внутри неё. При этом нужно пройтись по всей иерархии файлов и папок, находящихся внутри.

public long getFolderSize(String path) throws IOException {
    Path folder = Paths.get(path);
    return Files.walk(folder)
            .map(Path::toFile)
            .filter(File::isFile)
            .mapToLong(File::length)
            .sum();
}

Сначала создадим объект папки с помощью метода Paths.get(). В него передадим полный путь до интересующей нас папки. Этот путь мы получаем в качестве параметра нашего метода.

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

Выбор случайных элементов из списка

24 января 2020

Тэги: Java 10 алгоритмы

При разработке приложений иногда бывает необходимо выбрать случайный элемент из некоторого множества. Предположим, что у нас есть список фруктов и нам нужно выбрать случайным образом один из них.

var random = new SecureRandom();
var list = Arrays.asList("апельсин", "лимон", "грейпфрут");
var randomElement = list.get(random.nextInt(list.size()));
System.out.println(randomElement);

Сначала создадим генератор случайных значений SecureRandom. Можно также использовать и обычный Random, но первый выдаёт более случайные значения.

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

Чтение вводимых значений с консоли

23 января 2020

Тэги: Java 10 Java

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

var scanner = new Scanner(System.in);
System.out.print("Введите Ваше имя: ");
var username = scanner.nextLine();
System.out.print("Сколько Вам лет? ");
var age = scanner.nextInt();
System.out.println(String.format("Ваше имя: %s, ваш возраст: %s", username, age));

В конструктор этого класса передаётся стандартный поток ввода System.in. Далее мы запрашиваем у пользователя его имя с помощью метода nextLine(). Этот метод вернёт всю строку, которую введёт пользователь в консоли до нажатия клавиши Enter.

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

Алгоритм поиска простых чисел

7 мая 2019

Тэги: Java алгоритмы

Простое число - это число, которое делится нацело без остатка только на 1 и на самого себя. Также известно, что любое целое число, большее 1, является либо простым, либо может быть выражено как произведение простых чисел. Ряд простых чисел начинается с 2 и имеет следующий вид: 2, 3, 5, 7 и т.д.

Рассмотрим более-менее оптимальный алгоритм поиска простых чисел. Для этого давайте реализуем на Java метод getFirstPrimes(), который будет возвращать N первых простых чисел.

public List<Integer> getFirstPrimes(int count) {
    List<Integer> primes = new ArrayList<>();
    if (count > 0) {
        primes.add(2);
    }
    for (int i = 3; primes.size() < count; i += 2) {
        if (isPrime(i, primes)) {
            primes.add(i);
        }
    }
    return primes;
}

Все найденные простые числа будем складывать в список. Далее проверяем, что если у нас запросили хотя бы одно простое число, то сразу добавим 2, т.к. с него начинается последовательность. Далее в цикле начинаем проверять числа, сразу начиная с трёх. Также обратите внимание, что мы проверяем только нечётные числа (приращение +2), т.к. все чётные числа по определению делятся на 2.

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

CrudRepository

1 мая 2019

Тэги: Spring Boot Spring Data SQL PostgreSQL Kotlin rest

Ранее я уже писал статью CrudRepository в Spring Data, в которой рассматривался пример rest-сервиса, работающего с базой данных. Теперь хочу показать аналогичный пример, но вместо Java написать его на Kotlin, который стремительно набирает популярность. Rest-сервис состоит из трёх слоёв: слой работы с БД, сервисный слой и контроллер. Мы пойдём последовательно по слоям, начиная с нижнего.

В качестве примера возьмём сервис, работающий с музыкальными группами. У группы есть три основных параметра: название, количество участников и дата основания. Структура таблицы в postgres может выглядеть следующим образом:

create table band
(
  id serial,
  name character varying(50) not null,
  players_count integer not null,
  created date not null,
  constraint band_pk primary key (id)
);

Тип данных serial означает поле, значение которого автоматически увеличивается на 1 с каждой новой записью.

Заготовку проекта удобно сгенерить через start.spring.io. Там достаточно выбрать тип проекта - maven project, язык - kotlin. В качестве dependency добавить Web и JPA. Затем нажимаем Generate Project и вы уже скачали архив с заготовкой вашего проекта. Помимо указанных dependency для kotlin будут добавлены ещё несколько служебных, а также maven-плагины для его компиляции.

В секцию dependencies нам нужно добавить драйвер postgres, т.к. мы планируем работать именно с этой базой:

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.2.5</version>
</dependency>

Итоговый pom-файл проекта вы можете посмотреть на github.

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

Валидация бинов в Spring

28 апреля 2019

Тэги: Java Spring

Spring позволяет проверять формат данных в бинах в декларативном стиле при помощи специальных аннотаций из пакета javax.validation.

Предположим, у нас есть rest-контроллер, в который мы хотим добавить метод, создающий пользователя. Очевидно, что это будет POST-запрос:

@PostMapping("/users")
public String createUser(@Valid @RequestBody CreateUserRequest request) {
    // создание пользователя в БД
    return "Success";
}

На вход метод принимает бин CreateUserRequest, который мы будем передавать в формате json. Этот параметр метода снабжён аннотациями @RequestBody (говорит, что параметр будет именно в теле запроса) и @Valid (аннотация, которая активирует механизм валидации для данного бина). Обратите внимание, что если не указать аннотацию @Valid, то валидация работать не будет.

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

Конфигурационные файлы в Spring Boot

26 апреля 2019

Тэги: Spring Boot rest Java

Значения параметров системы удобно отделять от программного кода, чтобы можно было их менять без перекомпиляции всего приложения. Spring Boot предоставляет нам удобный способ работы с конфигурационными файлами. Ниже мы рассмотрим несколько случаев, начиная с самого простого.

Исходники доступны на github.

Одиночные параметры

Отдельное свойство можно внедрить в любой компонент Spring при помощи аннотации @Value.

Предположим, у нас есть простейшее Spring Boot приложение, в котором есть rest-контроллер с методами.

Добавим метод, который в ответ возвращает приветственный текст для пользователя, а имя пользователя будем брать из конфига.

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

Введение в многопоточность

25 апреля 2019

Тэги: Java многопоточность

Есть два способа создания потоков в Java: унаследоваться от класса Thread или реализовать интерфейс Runnable.

Создание потока через наследование

Рассмотрим пример, в котором мы расширяем стандартный класс Thread, переопределяя лишь один метод run(). В нём мы ждём 3 секунды, а затем выводим сообщение о завершении потока. Обратите внимание, что запуск потока осуществляется не через метод run(), а через метод start().

public class ThinkerThread extends Thread {

    @Override
    public void run() {
        try {
            TimeUnit.SECONDS.sleep(3); // аналогично Thread.sleep(3000L);
            System.out.println("Второй поток завершён");
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }

    public static void main(String[] args) {
        new ThinkerThread().start();
        System.out.println("Основной поток завершён");
    }
}

Метод TimeUnit.SECONDS.sleep() полностью эквивалентен стандартному Thread.sleep(), однако в первом случае мы явно указываем единицы измерения времени, что делает код более читаемым. Я рекомендую использовать именно такую форму записи.

Поскольку метод sleep() относится к низкоуровневым, он может кидать InterruptedException, которое свидетельствует о том, что поток был прерван. Это исключение является единственным признаком того, что поток был принудительно остановлен. И чтобы не терять эту информацию в стеке вызовов, мы выставляем флаг interrupted при помощи соответствующего метода Thread.currentThread(). Такой способ обработки InterruptedException является правильным и именно его нужно использовать в подобных случаях.

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

❮ Назад Далее ❯