Flattening a list of lists within a map

Wilhelm Sorban :

I have a stream of orders (the source being a list of orders). Each order has a Customer, and a list of OrderLine.

What I'm trying to achieve is to have a map with the customer as the key, and all order lines belonging to that customer, in a simple list, as value.

What I managed right now returns me a Map<Customer>, List<Set<OrderLine>>>, by doing the following:

orders
  .collect(
    Collectors.groupingBy(
      Order::getCustomer,
      Collectors.mapping(Order::getOrderLines, Collectors.toList())
    )
  );

I'm either looking to get a Map<Customer, List<OrderLine>>directly from the orders stream, or by somehow flattening the list from a stream of the Map<Customer>, List<Set<OrderLine>>> that I got above.

Abhijith Nagarajan :

You can simply use Collectors.toMap.

Something like

    orders
        .stream()
        .collect(Collectors
                .toMap(Order::getCustomer
                        , Order::getOrderLines
                        , (v1, v2) -> { List<OrderLine> temp = new ArrayList<>(v1); 
                                        temp.addAll(v2); 
                                        return temp;});

The third argument to the toMap function is the merge function. If you don't explicitly provide that and it there is a duplicate key then it will throw the error while finishing the operation.

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=115569&siteId=1