«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Продвинутые трюки с Java Stream, которые вам нужно знать

Продвинутые трюки с Java Stream, которые вам нужно знать

Опубликовано 18 ноября 2024 г.
Просматривать:454

dvanced Java Stream Tricks You Need to Know

1. Создание карты для кэширования объекта

Кэширование объектов на карте может повысить производительность за счет уменьшения необходимости многократного извлечения данных из базы данных или других источников данных. С помощью Java Streams вы можете легко создать такой кеш.

Пример кода

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class User {
    private int id;
    private String name;

    // Constructors, getters, setters
}

public class EntityCacheExample {
    public static void main(String[] args) {
        List users = List.of(
            new User(1, "Alice"),
            new User(2, "Bob"),
            new User(3, "Charlie")
        );

        Map userCache = users.stream()
            .collect(Collectors.toMap(User::getId, user -> user));

        System.out.println(userCache);
    }
}

В приведенном выше коде мы используем Collectors.toMap() для преобразования списка объектов User в карту, где ключом является идентификатор пользователя, а значением является сам объект User. Это эффективно создает кеш сущностей User.

Результат демо

{1=User{id=1, name='Alice'}, 2=User{id=2, name='Bob'}, 3=User{id=3, name='Charlie'}}

2. Создание вложенной карты

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

Пример кода

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class User {
    private String department;
    private String role;
    private String name;

    // Constructors, getters, setters
}

public class NestedMapExample {
    public static void main(String[] args) {
        List users = List.of(
            new User("HR", "Manager", "Alice"),
            new User("IT", "Developer", "Bob"),
            new User("IT", "Manager", "Charlie")
        );

        Map>> nestedMap = users.stream()
            .collect(Collectors.groupingBy(User::getDepartment,
                Collectors.groupingBy(User::getRole)));

        System.out.println(nestedMap);
    }
}

Этот код демонстрирует, как использовать Collectors.groupingBy() для создания вложенной Карты. Внешняя Map группирует пользователей по отделам, а внутренняя Map дополнительно группирует их по ролям.

Результат демо

{HR={Manager=[User{name='Alice'}]}, IT={Developer=[User{name='Bob'}], Manager=[User{name='Charlie'}]}}

3. Создание карты с двумя значениями

Иногда вам может потребоваться сохранить несколько атрибутов для одного ключа на карте. Использование Карты
>
может быть эффективным решением.

Пример кода

import java.util.List;
import java.util.Map;
import java.util.AbstractMap.SimpleEntry;
import java.util.stream.Collectors;

class User {
    private int id;
    private String name;
    private int age;

    // Constructors, getters, setters
}

public class MapWithTwoValuesExample {
    public static void main(String[] args) {
        List users = List.of(
            new User(1, "Alice", 30),
            new User(2, "Bob", 25),
            new User(3, "Charlie", 35)
        );

        Map> userMap = users.stream()
            .collect(Collectors.toMap(User::getId, user -> 
                new SimpleEntry(user.getName(), user.getAge())));

        System.out.println(userMap);
    }
}

Здесь мы используем SimpleEntry для создания карты с двумя значениями — именем и возрастом — связанными с каждым идентификатором пользователя.

Результат демо

{1=Alice=30, 2=Bob=25, 3=Charlie=35}

4. Группировка и сопоставление

Совместное группирование и сопоставление может упростить сложные преобразования данных, например преобразование списка объектов в сгруппированную Карту, где каждая группа содержит определенные атрибуты.

Пример кода

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class User {
    private String department;
    private String name;

    // Constructors, getters, setters
}

public class GroupingByMappingExample {
    public static void main(String[] args) {
        List users = List.of(
            new User("HR", "Alice"),
            new User("IT", "Bob"),
            new User("HR", "Charlie")
        );

        Map> groupedMap = users.stream()
            .collect(Collectors.groupingBy(User::getDepartment,
                Collectors.mapping(User::getName, Collectors.toList())));

        System.out.println(groupedMap);
    }
}

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

Результат демо

{HR=[Alice, Charlie], IT=[Bob]}

5. Группировка по, сопоставление и сокращение

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

Пример кода

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class Transaction {
    private String type;
    private int amount;

    // Constructors, getters, setters
}

public class GroupingByMappingReducingExample {
    public static void main(String[] args) {
        List transactions = List.of(
            new Transaction("Deposit", 100),
            new Transaction("Deposit", 200),
            new Transaction("Withdrawal", 50),
            new Transaction("Withdrawal", 30)
        );

        Map transactionSums = transactions.stream()
            .collect(Collectors.groupingBy(Transaction::getType,
                Collectors.reducing(0, Transaction::getAmount, Integer::sum)));

        System.out.println(transactionSums);
    }
}

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

Результат демо

{Deposit=300, Withdrawal=80}

6. Заключение

Эти продвинутые приемы Java Stream могут значительно повысить эффективность и читабельность вашего кода. Освоив эти методы, вы сможете легко решать сложные задачи по обработке данных. Если у вас есть какие-либо вопросы или вам нужны дополнительные разъяснения, не стесняйтесь оставлять комментарии ниже!

Подробнее читайте на сайте: 5 продвинутых приемов Java Stream, которые вам нужно знать

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/anh_trntun_4732cf3d299/5-advanced-java-stream-tricks-you-need-to-know-4i8h?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с [email protected] удалить его
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3