依深层财产收集groupB

时间:2018-09-26 15:11:55

标签: java-8 java-stream collectors

private Map<String, Set<Square>> populateZuloSquare(List<Square> squares) {
    if (squares == null || squares.isEmpty()) {
        return emptyMap();
    }

    Map<String, Set<Square>> res = new HashMap<>();

    squares.stream()
        .filter(square -> {
            if (square.getZuloCodes().isEmpty()) {
                LOG("Ignored {}", square.id);
                return false;
            }
            return true;
        })
        .forEach(square -> {
          square.getZuloCodes()
            .forEach(code -> {
                res.putIfAbsent(code, new HashSet<>());
                res.get(code).add(square);
            }));
        });

    return Collections.unmodifiableMap(res);
}

上面的代码接收一个Square列表,这些Square可能在内部包含ZuloCodes。输出应为不可变的Map zuloCode,并使用该UniquePrefix对所有平方进行赋值。 如您所见,我无法找出删除辅助集合res并使代码易于阅读的方法,有没有一种方法可以将该集合分解为[zuloCode,square],然后进行collect.groupBy?另外,如果过滤器内部不可读,您将如何解决?

2 个答案:

答案 0 :(得分:3)

标准方法是在使用Activity进行收集之前使用players = list() class Player(): name = None def __init__(self, name): self.name = name players.append(Entity('Adam')) players.append(Entity('James')) players.append(Entity('Sebastian')) sorted_player_names = sorted([player.name for player in players], key=str.lower) ,但是由于每个元素都需要原始的flatMap,因此需要映射到同时包含两个元素的对象{{ 1}}实例和zulo代码groupingBy

由于Java中还没有标准的对或元组类型(至今),一种解决方法是使用Square实例,像这样

Square

另一种方法是使用自定义收集器,该收集器将遍历键:

String

请注意,此自定义收集器可以看作是以下循环代码的并行功能变体:

Map.Entry

当您不需要代码具有并行功能时,现在看起来可能还不错...

答案 1 :(得分:0)

如何?您可以使用[HttpPost] public PdfResult DownloadBOLPdf(List<string> shipmentkey, List<BOLPdfInputs> BOLPdfInputs) { } public class BOLPdfInputs { public BOLPdfInputs(); public string AgreedValue1 { get; set; } public string AgreedValue2 { get; set; } public decimal? CodAmount { get; set; } public int? FreeTermsCollect { get; set; } public int? FreeTermsCustomerCheque { get; set; } public int? FreeTermsPrePaid { get; set; } public int? FreightByDriverPallets { get; set; } public int? FreightByDriverPieces { get; set; } public int? FreightByShipper { get; set; } public string ShipperSignature { get; set; } public int? TrailerByDriver { get; set; } public int? TrailerByShipper { get; set; } } map操作来完成此操作。我也更新了过滤器并对其进行了简化。

merge