0

它不是真正的代码,而是与我的确切场景的类比。这里主要关注的是 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())));
}
4

1 回答 1

1

您的第二次手术

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

保留前一个操作的结果键,只对值应用一个函数。您可以将函数应用于先前Collectorusing的结果collectingAndThen。要将其与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))
        ));
}
于 2021-11-08T11:50:26.260 回答