使用 java 8 流转换 List<Map<String,String>> 与“,”分隔的字符串值
Posted
技术标签:
【中文标题】使用 java 8 流转换 List<Map<String,String>> 与“,”分隔的字符串值【英文标题】:Transform List<Map<String,String>> with "," separated String values using java 8 stream 【发布时间】:2018-11-26 12:58:29 【问题描述】:我需要一种使用 java 8 流将下面提到的 JSON 转换为 List> 的方法。这里有一些挑战,有一些我需要并且需要忽略其余的属性。我基本上需要重量和产品。
[
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());
提前致谢。
【问题讨论】:
到目前为止你尝试了什么? 但实际上,您应该开始考虑类和对象,而不是考虑映射。定义一个具有两个类型化属性weight
和 product
的类,并使用它而不是使用映射。
@user2681668,您添加了额外的要求,我们仍然没有看到您的任何尝试。注意添加一些。
【参考方案1】:
类似的东西就足够了:
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());
更新:
在您编辑之后,我建议您创建一个具有属性weight
、type
、product
等的自定义类。启动许多对象需要用必要的数据填充它并将它们存储在列表中。
当您需要列表中的结果时,您可以在自定义对象列表上进行流式传输,然后收集到提取自定义对象权重及其产品属性的地图。
不幸的是,您当前使用 List<Map<String, String>>
的方法不是一个好方法。
【讨论】:
weight=30
将不再附加到每个拆分部分,不会有像weight=30, product=product-1
这样的地图
@Andrew 此解决方案假定格式为List<Map<String, String>> myList = new ArrayList<>(); HashMap<String, String> myMap = new HashMap<>(); myMap.put("30","product-1,product-2,product-3"); HashMap<String, String> myMap1 = new HashMap<>(); myMap1.put("15","product-1,product-3"); HashMap<String, String> myMap2 = new HashMap<>(); myMap2.put("50","product-1,product-4"); ...
等,这将产生[30=product-1, 30=product-2
等的正确输出。在每个条目中重复“weight=”和“product=”只是多余的 IMO。
@Andrew 现在 OP 已经编辑了帖子,这使我之前的评论不再有效,因为“显然”它不仅仅是一张应该在中提到的“重量”和“产品”的地图第一个位置不是人们开始回答时...
"Cannot infer type argument(s) for myList.stream() .flatMap((Map<String, String> map) -> map.entrySet() .stream() .flatMap((Map.Entry<String, String> e) -> Arrays.stream(e.getValue().split(",")) .map(a -> Map.of(e.getKey(), a)))) .collect(Collectors.toList());
以上是关于使用 java 8 流转换 List<Map<String,String>> 与“,”分隔的字符串值的主要内容,如果未能解决你的问题,请参考以下文章
通过流将带有列表的列表对象转换为Java 8中的映射[重复]
将 GraphTraversal<Vertex, Map<Object, List>> 转换为 Java8 流
Java 8:将 Map<String, List<String>> 转换为 Map<String, String[]> [重复]