Java8 | Как изящно инициализировать Map & List2Map?

Java задняя часть
Java8 | Как изящно инициализировать Map & List2Map?

Это 18-й день моего участия в ноябрьском испытании обновлений. Узнайте подробности события:Вызов последнего обновления 2021 г.

🤞 Персональная домашняя страница:@青城Sequencer Stone
🤞 Преимущества вентилятора:Добавить фан-базуОтвечайте на вопросы один на один, получайте бесплатные богатые шаблоны резюме, улучшайте учебные материалы и т. д. и станьте королем новой эры!

Скоро выйдет великая Java 18, и мы, возможно, все еще не знакомы с основным использованием Lambda в Java 8. В этой статье приведены некоторые советы по использованию Map в процессе разработки технологии Stream. После прочтения этой статьи, я уверен, вы обязательно иметь новое понимание Stream.

1. Элегантно инициализируйте карту

Прежде чем смотреть вниз, подумайте, что, если бы вы неApache commonВ ожидании трехстороннего пакета, как бы вы инициализировали его с начальным значениемMap, подумав об этом, продолжайте смотреть вниз, код примерно такой, как показано в следующем коде.

final HashMap<String, String> maps = new HashMap<>();
maps.put("key1", "value1");
maps.put("key2", "value2");

Вышеупомянутый метод действительно может инициализировать карту, но самая большая проблема заключается в том, что нам может потребоваться изменить много строк наputПары "ключ-значение" очень повторяющиеся и многословные. Чтобы код оставался чистым и аккуратным, используйтеJava 8Преимущество в том, что мы можем использовать что-то вроде следующего кодаstreamдля инициализации.

final HashMap<String, String> maps = Stream.of(new Object[][]{{"key1", "value1"}})
    .collect(Collectors.toMap(data -> (String) data[0], data -> (String) data[1]));

Одна строка кода для завершения инициализации Map, это более элегантно? если вы использовалиjooqизTuple, то вы найдете использованиеTupleОн будет более элегантным и сможет делать более невероятные вещи.

2. Элегантный список на карту

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

Если у нас есть классProduct, как показано в коде ниже.

@Getter
@Setter
@ToString
@Builder
class Product{
    private Long id;
    private String category;
    private String name;
}

у нас есть сейчасList<Product>форматировать данные.

static List<Product> getList(){
    final List<Product> productList = new ArrayList<>(100);
    for(int i =1;i<=100;i++){
        productList.add(Product.builder()
            .id((long) i)
            .name("name"+i)
            .category("category"+i%9)
            .build());
    }
    return productList;
}

Теперь мы собираемся получитьДанные формата карты с идентификатором в качестве ключа и именем в качестве значения, код показан ниже.

Map<Long, String> map = productList.stream().collect(Collectors.toMap(Product::getId, Product::getName));

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

Map<Long, Product> map = productList.stream().collect(Collectors.toMap(Product::getId, data -> data));

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

#冲突发生时,保留先存在的数据,可按照业务自定义
Map<String, String> map = productList.stream().collect(Collectors.toMap(Product::getCategory, Product::getName, (existing, replacement) -> existing));

Тогда, если вы хотите, наконец, получитьпоточно-безопасная карта, как решить, нужно пройти вSupplier<M> mapSupplier, код показан ниже.

#这里引入的是ConcurrentHashMap,同样的也可以用TreeMap的实现
ConcurrentHashMap<String, String> map = productList.stream().collect(Collectors.toMap(Product::getCategory, Product::getName, (existing, replacement) -> existing, ConcurrentHashMap::new));

Мальчик, ты не можешь видеть достаточно? нажмите на каменьПодробное описание, Просто нажмите и посмотрите, может быть, будут сюрпризы? Добро пожаловать в поддержкуНравится/Подписывайтесь/Комментируйте, ваша поддержка — моя самая большая мотивация для Gengwen, спасибо!