Pascal4eg / Java

 Java | Фишки и трюки

StringJoiner

StringJoiner sj = new StringJoiner(", ", "[", "]");
sj.setEmptyValue( "No items");
System.out.println(sj.toString()); // No items

sj.add("Apple").add("Banana").add("Cherry");
System.out.println(sj.toString()); // [Apple, Banana, Cherry]

StringJoiner - это класс, который предназначен для объединения строк с использованием разделителя между ними. Этот класс был введен в Java 8 в пакете java.util. Он облегчает создание текстовых последовательностей, объединяя строки и вставляя разделители между ними.

...

Читать дальше

Скачать файл используя Java NIO

// Download file from FILE_URL to FILE_NAME
URL url = new URL(FILE_URL);
try (ReadableByteChannel readableByteChannel = Channels.newChannel(url.openStream());
     FileOutputStream fileOutputStream = new FileOutputStream(FILE_NAME);
     FileChannel fileChannel = fileOutputStream.getChannel()) {
    fileChannel.transferFrom(readableByteChannel, 0, Long.MAX_VALUE);
} catch (IOException e) {
    throw new RuntimeException(e);
}

Пакет Java NIO предлагает возможность передавать байты между двумя каналами без их буферизации в памяти приложения.

...

Читать дальше

ACID (Atomicity, Consistency, Isolation, Durability)

ACID (Atomicity, Consistency, Isolation, Durability) - это набор свойств, которые определяют стандарты для транзакций в базах данных. Эти свойства обеспечивают надежность и целостность данных в базе данных, даже в случае сбоев системы или непредвиденных ситуаций. Давайте рассмотрим каждое из этих свойств более подробно:

...

Читать дальше

MinIO - хранилище данных

MinioClient minioClient = MinioClient.builder()
        .endpoint(minioUrl)
        .credentials(minioLogin, minioPassword)
        .build();
// Save file
ByteArrayInputStream bais = new ByteArrayInputStream(data);
minioClient.putObject(PutObjectArgs.builder()
                .bucket(minioBucket)
                .object(fileName)
                .stream(bais, data.length, -1).build( ));
// Get file
InputStream inputStream = minioClient.getobject(
        GetObjectArgs.builder()
                .bucket(minioBucket)
                .object(fileName)
                .build());
// Delete file
minioClient.removeObject(RemoveObjectArgs.builder()
                .bucket(minioBucket)
                .object (fileName)
                .build());

Часто в Java-приложении есть необходимость хранить файлы. И если приложение состоит из нескольких микросервисов, которым нужен доступ к файлам, то не обойтись без централизованного файлового хранилища. Одним из таких хранилищ является MinIO.

MinIO - это open source хранилище данных, совместимое с Amazon S3. Он обеспечивает отказоустойчивость, масштабируемость, шифрование данных и предоставляет богатые клиентские библиотеки для интеграции в приложения.

MinIO становится популярным выбором для хранения и управления данными благодаря своей гибкости и совместимости с Amazon S3, что делает его подходящим для широкого спектра приложений, от простых хранилищ данных до сложных облачных сценариев.

Читать дальше

QueryDSL

EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnitName");
EntityManager em = emf.createEntityManager();
JPAQueryFactory queryFactory = new JPAQueryFactory(JPQLTemplates.DEFAULT, em) ;
QPerson person = Person.person;
List<Person> persons = queryFactory.selectFrom(person)
        .where(
            person.firstName.eq("John"),
            person.lastName.eq("Doe"))
        .orderBy(
            person.lastName.asc(),
            person.firstName.desc())
        .fetch();

QueryDSL — это мощный и чрезвычайно гибкий инструмент для работы с БД и просто подарок для Java-разработчиков, которые не очень хорошо разбираются в SQL (или совсем не разбираются), поскольку позволяет работать с БД при помощи привычного объектного представления сущностных зависимостей.

...

Читать дальше

🐳 Запуск java приложения в Docker

Dockerfile

Для запуска приложения в докере понадобится установленный Docker и приложение собранное в jar файл.

Для создания docker образа (image), на основе которого будет создаваться контейнер с вашим приложением, нужен файл с именем Dockerfile.

...

Читать дальше

@Value Spring annotation

import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.Arrays;

@Service
public class MyService {
    @Value("string value")
    private String stringValue;
    @Value("${value.from.file}")
    private String valueFromFile;
    @Value("${systemValue}")
    private String systemValue;
    @Value("${unknown. param: some default}")
    private String someDefault;
    @Value("${priority}")
    private String prioritySystemProperty;
    @Value("${listOfValues}")
    private String[] valuesArray;

    @PostConstruct
    private void postConstruct() {
        System.out.println(stringValue); // string value
        System.out.println(valueFromFile); // Value got from the file
        System.out.println(systemValue); // systemValue
        System.out.println(someDefault); //some default
        System.out.println(prioritySystemProperty); // high
        Arrays.stream(valuesArray).forEach(System.out::println); // A B C
    }
}

Эту аннотацию можно использовать для ввода значений в поля в bean-компонентах, управляемых Spring, и ее можно применять на уровне поля или параметра конструктора/метода.

Читать дальше

Запечатанные классы (Sealed class)

public sealed class Color permits Red, Green, Blue { 

}

public sealed class Red extends Color permits Ruby, Raspberry, Cherry {

}

public non-sealed class Green extends Color {

}

public final class Blue extends Color {

}

Sealed class дословно переводится как «запечатанный класс». В этом классе нужно сразу объявить список классов-наследников, потому что кроме них наследников быть не может.

Читать дальше

instanceof в Java 16

Object string = "this is string!";
if (string instanceof String realString) {
    System.out.println(realString);
}
Object object = 42;
if (!(object instanceof Number number)) {
    throw new IllegalArgumentException("this is not a Number!");
}
System. out.println (number);

Чтобы проверить, к какому классу относится объект, используют оператор instanceof. Если нужно проверить объект и привести его к нужному классу, раньше писали условие с instanceof, объявляли переменную проверяемого типа и присваивали ей проверяемый объект, предварительно приведя его к проверяемому классу.

Читать дальше

Множественная реализация интерфейсов с одинаковыми методами по умолчанию

interface Magician {
    default String getInfo() {
        return "Magician";
    }
}

interface QuidditchPlayer {
    default String getInfo() {
        return "QuidditchPlayer";
    }
}

static class HarryPotter implements Magician, QuidditchPlayer {
    @Override
    public String getInfo() {
        return Magician.super.getInfo() + ", " + QuidditchPlayer.super.getInfo();
    }
}

public static void main(String[] args) {
    HarryPotter harryPotter = new HarryPotter();
    System.out.println(harryPotter.getInfo());
    // Magician, QuidditchPlayer
}

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

Читать дальше