变换列表<map <string,string>&gt;使用“,”分隔使用java 8流的字符串值

时间:2018-06-17 12:24:36

标签: java java-8 java-stream

我需要一种方法将下面提到的JSON转换为List&gt;使用java 8流。这里有一些挑战,我需要一些属性,需要忽略其余的属性。我基本上需要重量和产品。

[
        {weight=30, type=cosmatic, product=product-1,product-2,product-3}, 
        {weight=15, type=commercia, product=product-1,product-3}, 
        {weight=50, ramdonField=newValue, product=product-1,product-4}, 
        {weight=2,  product=product-1,product-2}, 
        {weight=15, product=product-1}, 
        {weight=25, product=product-1}, 
        {weight=2,  product=product-1}
    ]

我能够通过编写下面的代码来实现这一点,只是想知道是否有更有效的方法来做到这一点。

    List<Map<String, Object>> franchiseRulesTemp = new LinkedList<>();
    for (Entry<String, Object> test : config.entrySet()) {
                try {
                    if (test.getValue() instanceof Map<?, ?> && ((Map<String, Object>) test.getValue()).containsKey("product")) {
                        Map<String, Object> mapper = ((Map<String, Object>) test.getValue());
                        String productList = (String) mapper.get("product");
                        String[] productListArray = productList.split(",");
                        for (String product : productListArray) {
                            Map<String, Object> gameDetails = new HashMap<>();
                            gameDetails.putAll((Map<String, Object>) test.getValue());
                            gameDetails.put("product",product);
                            gameDetails.put("ruleName", test.getKey());
                            franchiseRulesTemp.add(gameDetails);
                        }
                    } 
                } catch (Exception exception) {
                    System.out.println("Occured" + exception.getMessage());
                }
            }

提前致谢。

1 个答案:

答案 0 :(得分:0)

有些事情就足够了:

List<Map<String, String>> resultSet = 
          myList.stream()
                .flatMap(map -> map.entrySet()
                               .stream()
                               .flatMap(e -> Arrays.stream(e.getValue().split(","))
                               .map(a -> Map.of(e.getKey(), a))))
                .collect(Collectors.toList());

<强>更新

修改完成后,我建议您使用属性weighttypeproduct等创建自定义类。然而,需要调整许多对象,并使用必要的数据填充它并将它们存储在列表中。

当您需要列表中的结果时,您可以流式传输自定义对象列表,然后收集到地图中,提取自定义对象及其产品属性的权重。

不幸的是,使用List<Map<String, String>>的当前方法并不是一个好的方法。