【问题标题】:java stream pipeline to create map of listsjava流管道创建列表映射
【发布时间】:2021-12-18 04:41:12
【问题描述】:

它不是真正的代码,而是与我的确切场景的类比。这里主要关注的是 util 流管道。

假设,我遵循对象模型

    @Data
    class ItemRequest {
       String action;
       List<ItemId> itemIds;
    }
    @Data
    class ItemId{
       ItemType itemType;
       long itemKey;
    }
    @Getter 
    @AllArgsConstructor
    enum ItemType{

      String backingService;
      String description; 

      ITEM_TYPE_1("backingService1","type 1 description"),
      ITEM_TYPE_2("backingService1","type 2 description"),
      ITEM_TYPE_3("backingService2","type 3 description"),
      ITEM_TYPE_4("backingService2","type 4 description"),
      ITEM_TYPE_5("backingService2","type 5 description"),
      ITEM_TYPE_6("backingService3","type 6 description"),
      ITEM_TYPE_7("backingService3","type 7 description"),
     //   so on
    }

现在每个 ItemType 都有不同的后端微服务。 我的 ItemType 枚举具有返回支持服务的吸气剂。 所以我想通过支持服务来分解我的 ItemRequest。

我可以很容易地以命令方式或运行 2 个流管道来完成它。 但我想在一个流管道中使用它

例如,简单来说,我的问题是 如何将我在下面编写的以下 2 个步骤合并到一个管道中 .

Map<String,ItemRequest> breakItemRequestAsPerBackingService
 (ItemRequest originalItemRequest ){
    Map<String, List<ItemId>> collect
     = originalItemRequest
               .getItemIds()
               .stream()
               .collect(Collectors.groupingBy(
                     e -> e.getItemType().getBackingService()));



    return collect 
    .entrySet()
    .stream()
    .collect(toMap(
             Map.Entry::getKey,
              e -> new ItemRequest(
                     originalItemRequest.getAction(), 
                     e.getValue())));
}

【问题讨论】:

    标签: stream collectors groupingby


    【解决方案1】:

    你的第二次手术

    collect.entrySet().stream()
        .collect(toMap(
            Map.Entry::getKey,
            e -> new ItemRequest(originalItemRequest.getAction(), e.getValue())));
    

    保留前一个操作的结果键,并且只对这些值应用一个函数。您可以使用collectingAndThen 将函数应用于先前Collector 的结果。要将其与groupingBy 一起用于映射值,您必须意识到groupingBy(f)groupingBy(f, toList()) 的简写,因此toList() 是与collectingAndThen 结合的收集器。

    Map<String,ItemRequest>
        breakItemRequestAsPerBackingService(ItemRequest originalItemRequest) {
    
        return originalItemRequest.getItemIds().stream()
            .collect(Collectors.groupingBy(e -> e.getItemType().getBackingService(),
                Collectors.collectingAndThen(Collectors.toList(),
                    list -> new ItemRequest(originalItemRequest.getAction(), list))
            ));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      • 2015-12-27
      • 1970-01-01
      • 2017-09-22
      • 2020-05-13
      • 2015-09-01
      • 1970-01-01
      相关资源
      最近更新 更多