Pascal4eg / Java

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

Метод putIfAbsent() интерфейса Map

public class PutIfAbsent {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        System.out.println("prev value - " + map.putIfAbsent("hello", null)); // prev value - null
        System.out.println("prev value - " + map.putIfAbsent("hello", "world")); // prev value - null
        System.out.println("prev value - " + map.putIfAbsent("hello", "мир")); // prev value - world
        System.out.println(map); // {hello=world}
    }
}

Если указанный ключ еще не связан со значением (или сопоставлен со значением null), он связывает его с заданным значением и возвращает значение null, в противном случае возвращается текущее значение.

...

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

BIRT (Business Intelligence and Reporting Tools)

BIRT (Business Intelligence and Reporting Tools) - это открытая платформа, предоставляющая возможности для создания отчетов и бизнес-аналитики в приложениях, разрабатываемых на языке программирования Java. Эта платформа предоставляет инструменты для создания, развертывания и поддержки отчетов различной сложности.

Вот несколько ключевых аспектов BIRT:

...

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

Метод retainAll()

List<String> list = new ArrayList<>();
list.add("apple");
list.add("orange");
list.add("melon");

List<String> list2 = new ArrayList<>();
list2.add("pineapple");
list2.add("orange");
list2.add("apple");

System.out.println(list.retainAll(list2)); // true
System.out.println(list); // [apple, orange]

Метод retainAll() интерфейса Collection, удаляет из коллекции все элементы, не содержащиеся в переданной коллекции. По сути оставляет в коллекции только пересекающиеся элементы из двух коллекций.

...

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

Несколько способов для избежания NullPointerException

👉 Используйте Optional из пакета java.util.

👉 При сравнении константы с переменной пришедшей из вне, нужно вызывать equals() на константе.

👉 А при сравнении двух переменных используйте java.util.Objects#equals.

👉 Используйте библиотеки с null-безопасностью, например, Apache Commons StringUtils.

👉 Вызывайте методы equals() и equalsIgnoreCase() на известных объектах.

👉 Применяйте valueOf() вместо toString().

👉 Воспользуйтесь аннотациями @NotNull и @Nullable на основе IDE.

👉 При возврате из метода коллекций, не стоит возвращать null, лучше пустую коллекцию (java.util.Collections#emptyList).

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

Библиотека Retrofit

public interface GitHubService {
    @GET("users/{user}/repos")
    Call<List<Repo>> listRepos(@Path("user") String user);
}
...

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://api.github.com/")
        .addConverterFactory(GsonConverterFactory.create())
        .build();

GitHubService service = retrofit.create(GitHubService.class);
Call<List<Repo>> call = service.listRepos("JakeWharton");
List<Repo> repos = call.execute().body();
repos.forEach(System.out::println);

Retrofit - это библиотека для работы с HTTP-запросами в Java и Android, разработанная компанией Square. Основной целью Retrofit является упрощение выполнения сетевых запросов и преобразование HTTP-ответов в объекты Java. Retrofit использует аннотации Java для определения типа запроса, параметров, URL и других свойств.

...

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

Контракт метода hashCode

Для реализации хэш-функции в спецификации языка определены следующие правила:

  1. вызов метода hashCode() один и более раз над одним и тем же объектом должен возвращать одно и то же хэш-значение, при условии что поля объекта, участвующие в вычислении значения, не изменялись.
  2. вызов метода hashCode() над двумя объектами должен всегда возвращать одно и то же число, если эти объекты равны (вызов метода equals() для этих объектов возвращает true).
  3. хороший hashCode() должен распределять объекты по хеш-таблице равномерно, минимизируя количество коллизий (одинаковых хешей у разных объектов).
Читать дальше

HttpClient

HttpClient httpClient = HttpClient.newBuilder()
        .connectTimeout(Duration.ofSeconds(10))
        .build();

HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://example.com"))
        .GET()
        .build();

HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());

System.out.println("Status code: " + response.statusCode());
System.out.println("Response body: " + response.body());

HttpClient представляет собой класс, введенный в Java 11, который предоставляет более современный и гибкий способ для выполнения HTTP-запросов и обработки HTTP-ответов. Он заменяет устаревший HttpURLConnection и предоставляет более удобный интерфейс для работы с сетевыми операциями.

HttpClient также поддерживает асинхронные операции, позволяя выполнять запросы асинхронно с использованием CompletableFuture.

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

Цепочка методов (Method chaining)

public class Student {
    String name;
    int age;
    String group;

    public Student setName(String name) {
        this.name = name;
        return this;
    }

    public Student setAge(int age) {
        this.age = age;
        return this;
    }

    public Student setGroup(String group) {
        this.group = group;
        return this;
    }
}

...

Student student = new Student()
                .setName( "Piter")
                .setAge(20)
                .setGroup("CS-23");

Цепочка методов (Method chaining) — это общий синтаксис для нескольких вызовов методов в объектно-ориентированных языках программирования. Каждый метод возвращает объект, что позволяет объединить вызовы в один оператор без необходимости использования переменных для хранения промежуточных результатов.

...

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

Класс Properties

String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
String appConfigPath = rootPath + "app.properties";
Properties appProps = new Properties();
appProps.load(new FileInputStream(appConfigPath));
System.out.println(appProps.getProperty("version")); // 1.0
System.out.println(appProps.getProperty("name")); // TestApp

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

...

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

Stream API. Метод dropWhile

// отбросить все первые отрицательные числа
List<Integer> digits = List.of(-2, -1, 0, 1, 2, 1, 0, -1, -2);
digits.stream()
    dropWhile(d -> d < 0)
    forEach(System.out::println);
// 0 1 2 1 0 -1 -2

Метод dropWhile был введен в интерфейсе Stream в JDK 9. Этот метод позволяет пропускать элементы в начале потока данных, пока они удовлетворяют определенному условию, и возвращает новый поток, начиная с первого элемента, который не соответствует условию.

...

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