Создайте Map<Long, CustomObject> , повторяя List<CustomObject>

У меня есть список заказов, который я получаю из какого-то третьего API.

List<Order> orders = fromApi(orderId);

Вот класс Order:

class Order{
     Long orderId;
     Product product
}

Точно так же я приношу продукты и для этих заказов. Здесь ключом является orderId.

List<Order> orderIds = orders.stream().map(Order::orderId).collect(Collectors.toList());
Map<Long,Product> userProductMap = fromAnotherApi(orderIds);

Вот класс продукта:

class Product{
        String productDesc;
}

Я хочу извлечь карту с orderId в качестве ключа и Order в качестве значения (указанного ниже), но в то же время я также хочу обновить заказы с помощью продукта (из userProductMap) в той же итерации потока.

 Map<Long,Order> userOrderMap = orders.stream().collect(Collectors.toMap(order -> order.id, Function.identity()));

Я хочу предоставить некоторую пользовательскую реализацию вместо Function.identity(), чтобы, помещая здесь Order в качестве значения в Map, я извлекал продукт из userProductMap, обновлял в Order и использовал обновленный Order в Map в качестве значения.

какой идентификатор пользователя? Ни ваш Order, ни ваш Product не содержат того, что соответствует вашему описанию.

cyberbrain 16.07.2024 13:00

Я только что обновил, это orderId, а не userId.

Atul Kumar 16.07.2024 13:09

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

VGR 16.07.2024 13:46

Вместо Function.identity() вы можете ссылаться на любой метод, который принимает Order в качестве параметра и возвращает Order. Просто напишите такой метод, который делает с переданным Order все, что захотите.

Thomas Kläger 16.07.2024 14:17

какой ключ в userProductMap?

cyberbrain 16.07.2024 15:39

@VGR только что обновил код.

Atul Kumar 17.07.2024 10:51

@cyberbrain Я обновляю код для большей ясности.

Atul Kumar 17.07.2024 10:52

вы не ответили на мой вопрос: какой ключ в userProductMap - есть Long из вызова API, но вы не сказали нам, например, это ли это. идентификатор продукта или что-то совершенно другое. Кроме того, слово «пользователь» в названиях ваших карт меня немного смущает: есть ли где-нибудь задействованный пользователь (я имею в виду код, а не то, что пользователь может запускать все это)?

cyberbrain 17.07.2024 12:50

Ключ @cyberbrain для userProductMap — это orderId. и Эта карта приходит как ответ от другого API. «Аналогично я получаю продукты и для этих заказов. Здесь ключ — orderId».

Atul Kumar 17.07.2024 12:54

извини, перечитал.

cyberbrain 17.07.2024 13:46

Поскольку ваш Product имеет только описание в качестве элемента, как вы узнаете, какие продукты являются «новыми», но связаны со старым продуктом, который вы хотите заменить? Есть ли внутри продукта также идентификатор? Какая-то внешняя функция, которая может определить, являются ли два экземпляра продукта одинаковыми в бизнес-представлении, даже если они находятся в разных объектах?

cyberbrain 17.07.2024 13:49

@cyberbrain предположим, что на моей стороне у продукта на данный момент нет идентификатора. Это сопоставление исходит из другого API, на данный момент мы можем избежать этого идентификатора продукта.

Atul Kumar 19.07.2024 10:40

Итак, вам нужно объяснить, как можно «извлечь продукт из userProductMap, обновить его в Order и использовать обновленный Order в Map в качестве значения». - как связать товар из заказа с обновленным товаром из userProductMap ?

cyberbrain 19.07.2024 14:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
13
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не уверен, что потоки здесь полезны, поскольку вы изменяете каждый заказ при добавлении его на карту. Я бы просто использовал цикл:

Map<Long, Order> ordersById = new HashMap<>();
for (Order order : orders) {
    Long orderId = order.getOrderId();
    order.setProduct(userProductMap.get(orderId));
    ordersById.put(orderId, order);
}

Если вы настаиваете на том, чтобы сделать это с помощью Stream, и если у вас есть возможность изменить класс Order, вы можете добавить метод цепочки, который возвращает сам объект:

public class Order {
    // [other fields and methods]

    public Order withProduct(Product product) {
        this.product = product;
        return this;
    }
}

что позволяет вам написать это:

Map<Long, Order> ordersById = orders.stream()
    .collect(Collectors.toMap(o -> o.getOrderId(),
        o -> o.withProduct(userProductMap.get(o.getOrderId()))));

Если у вас нет возможности изменять класс Order, но вы все равно настаиваете на использовании Stream, вам, вероятно, придется вернуться к использованию метода peek:

Map<Long, Order> ordersById = orders.stream()
    .peek(o -> o.setProduct(userProductMap.get(o.getOrderId())))
    .collect(Collectors.toMap(o -> o.getOrderId(), o -> o));

На самом деле это не для чего нужен просмотр, поэтому лично я бы выбрал один из других подходов.

Другие вопросы по теме