Pascal4eg / Java

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

Switch-выражения

String season = switch (month) {
    case JANUARY, FEBRUARY -> "winter";
    case MARCH, APRIL, MAY -> "spring";
    case JUNE, JULY, AUGUST -> "summer";
    case SEPTEMBER, OCTOBER, NOVEMBER -> {
        System.out.println("winter is coming!");
        yield "autumn";
    }
    case DECEMBER -> "winter";
}

Чтобы получить значение из switch-выражения, раньше приходилось создавать отдельную переменную и постоянно использовать break;.

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

Text Blocks (Текстовые блоки)

public static final String TEST_STUDENT_XML = """
    <student>
        <name>Harry Potter</name>
        <faculty>Gryffindor</faculty>
    </student>
    """;

В Java 15 появилась возможность задать константу типа String состоящую из нескольких строк без использования конкатенации.

Мы можем использовать текстовые блоки, объявив строку с """ (три двойные кавычки).

Это, безусловно, самый удобный способ объявления многострочной строки.

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

Guava: Google Core Libraries for Java

RangeSet<Integer> numberRangeSet = TreeRangeSet.create();

numberRangeSet.add(Range.closed(0, 2));
numberRangeSet.add(Range.closed(3, 5));
numberRangeSet.add(Range.closed(6, 8));

assertTrue(numberRangeSet.contains(1));
assertFalse(numberRangeSet.contains(9));

Guava — это набор общих библиотек Java от Google, который включает в себя новые типы коллекций (такие как multimap и multiset), неизменяемые коллекции, библиотеку графов и утилиты для параллелизма, ввода-вывода, хеширования, примитивов, строк и многого другого! Он широко используется в большинстве проектов Java в Google, а также во многих других компаниях.

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

Stream API: filter() перед map()

var list = Arrays.asList(1, 2, 3, 4, 5);
var filteredList = list.stream()
        .filter(i -> i % 2 == 0)
        .map(i -> i * 2)
        .collect(Collectors.toList());

В Stream API используйте filter() перед map(), чтобы избежать ненужной обработки.

Если у вас есть поток, который может содержать большое количество элементов, не соответствующих вашим критериям, используйте filter() перед map(), чтобы избежать ненужной обработки. Это может улучшить производительность вашего кода.

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

Jetty

int port = 80;
Server server = new Server(port);
ServletContextHandler context = new ServletContextHandler(server, "/");
context.addServlet(MyServlet.class, "/*");
server.start();

Jetty - это встраиваемый веб-сервер и контейнер сервлетов, разрабатываемый Eclipse Foundation. Jetty предоставляет компактное и легковесное решение для обработки HTTP-запросов и запуска веб-приложений в среде Java. Он широко используется в индустрии веб-разработки и часто встречается в различных проектах и приложениях, где требуется встроенный сервер.

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

Java NIO

Java NIO (New I/O) — это набор функциональных возможностей для работы с вводом и выводом данных (I/O), представленный в Java 1.4. Этот набор функций предоставляет более эффективный и мощный способ обработки операций ввода-вывода по сравнению с традиционным I/O API, известным как Java IO (или Java I/O).

Вот основные компоненты Java NIO:

Буферы (Buffers): Основная идея в Java NIO - работа с данными через буферы. Буферы - это области памяти, которые используются для временного хранения данных перед и после их обработки. Java NIO предоставляет разные типы буферов, такие как ByteBuffer, CharBuffer, IntBuffer и другие, каждый из которых предназначен для работы с определенными типами данных.

Каналы (Channels): Каналы представляют собой абстракцию для работы с источниками данных и целевыми местами данных. Каналы могут быть использованы для чтения из файлов, записи в файлы, работы с сетевыми соединениями и т. д. Основные классы для каналов включают FileChannel, SocketChannel, ServerSocketChannel и DatagramChannel.

Селекторы (Selectors): Селекторы предоставляют механизм для мультиплексирования операций ввода-вывода на нескольких каналах. Селекторы позволяют одному потоку обрабатывать несколько каналов одновременно, что делает Java NIO особенно полезным для серверных приложений, обслуживающих множество клиентов.

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

JTwig

import org.jtwig.JtwigModel;
import org.jtwig.JtwigTemplate;

public class TwigExample {
    public static void main(String[] args) {
        JtwigTemplate template = JtwigTemplate.inline("Hello, {{ name }}!");
        JtwigModel model = JtwigModel.newModel().with("name", "JTwig" ) ;

        String output = template.render(model);
        System.out.println(output); // Hello, JTwig!
    }
}

JTwig - это библиотека шаблонизации для языка программирования Java. Она предоставляет удобный способ создания и обработки шаблонов для генерации текстового или HTML-кода. JTwig особенно полезен, когда вам нужно создавать динамические страницы в веб-приложениях, генерировать отчеты, email-рассылки или форматировать текстовый вывод.

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

SerialVersionUID

private static final long serialVersionUID = -6849794470754667710L;

SerialVersionUID - это private static final поле типа long класса который реализует интерфейс Serializable.

Во время сериализации, если мы не объявляем SerialVersionUID в нашем классе, среда выполнения Java создает номер версии для класса, так что она может десереализировать его позже. Если во время десериализации, SerialVersionUID не соответствует, то процесс завершится с исключением InvalidClassException.

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

Константы в Java

public static final double PI = 3.1415;

В Java нет специального ключевого слова для определения константы как в других языках.

Константа в языке Java реализована комбинацией двух ключевых слов: static и final.

static означает, что значение принадлежит классу. А final разрешает присвоить переменной значение только один раз.

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

ThreadLocal

ThreadLocal - это класс в Java, который позволяет создавать локальные переменные, привязанные к каждому потоку. Это полезно, когда вам нужно иметь уникальную копию переменной для каждого потока, чтобы избежать конфликтов и обеспечить безопасность в многопоточной среде.

Преимущества ThreadLocal:

  1. Безопасность потоков: Каждый поток имеет свою собственную копию переменной, что устраняет соревнование и конфликты доступа.
  2. Улучшение производительности: Использование ThreadLocal может уменьшить необходимость синхронизации при доступе к переменным в многопоточной среде.
  3. Удобство: ThreadLocal делает работу с потоками более удобной и чистой, позволяя каждому потоку иметь свои собственные данные.
Читать дальше