Кэширование объектов на карте может повысить производительность за счет уменьшения необходимости многократного извлечения данных из базы данных или других источников данных. С помощью 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) { Listusers = 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'}}
Вложенные карты могут быть полезны, когда вам нужно классифицировать данные по нескольким уровням. Например, вы можете сгруппировать пользователей по их отделу, а затем по их роли.
Пример кода
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) { Listusers = 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'}]}}
Иногда вам может потребоваться сохранить несколько атрибутов для одного ключа на карте. Использование Карты
>
может быть эффективным решением.
Пример кода
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) { Listusers = 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}
Совместное группирование и сопоставление может упростить сложные преобразования данных, например преобразование списка объектов в сгруппированную Карту, где каждая группа содержит определенные атрибуты.
Пример кода
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) { Listusers = 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]}
Сочетание группировки, сопоставления и сокращения позволяет эффективно агрегировать данные, например суммировать значения или находить максимальное значение в каждой группе.
Пример кода
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) { Listtransactions = 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}
Эти продвинутые приемы Java Stream могут значительно повысить эффективность и читабельность вашего кода. Освоив эти методы, вы сможете легко решать сложные задачи по обработке данных. Если у вас есть какие-либо вопросы или вам нужны дополнительные разъяснения, не стесняйтесь оставлять комментарии ниже!
Подробнее читайте на сайте: 5 продвинутых приемов Java Stream, которые вам нужно знать
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3