我的Order类如下:
class Order {
String orderId;
String executionId;
Order(String orderId, String executionId) {
this.orderId = orderId;
this.executionId = executionId;
}
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public String getExecutionId() {
return executionId;
}
public void setExecutionId(String executionId) {
this.executionId = executionId;
}
}List<Order> orders =
Arrays.asList( new Order("2", "23,21,25"),
new Order("4", "22,24"),
new Order("6", "27"),
new Order("2", "28,30"),
new Order("4", "29"),
new Order("5", "26"));我需要按照下面的结构输出map对象,以获得与执行相关的命令。
Map<String, String> = {"23","2"},{"21","2"},{"25","2"},{"22","4"},{"24","4"},{"27","6"},{"28","2"},{"30","2"},{"29","4"},{"26","5"};逗号分隔的值应视为映射键,对象的其他值应为值。
发布于 2020-02-29 15:37:43
我会去做下面这样的事情-
Map<String, String> flatMap = new HashMap<>();
orders.forEach(order -> {
String k = order.orderId;
String values = order.executionId;
for (String v : values.split(",")) {
flatMap.put(v, k);
}
});不是一种更简单的方法,而是更明智的可读性。
下面是一个不太可取的方法-
Map<String, String> flatMap = orders.stream()
.map(order -> Arrays.stream(order.executionId.split(","))
.collect(Collectors.toMap(Function.identity(), x -> order.orderId)))
.flatMap(map -> map.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));发布于 2020-02-29 16:46:39
我想这就是你想要的。
List<Order> orders = Arrays.asList(
new Order("2", "23,21,25"),
new Order("4", "22,24"), new Order("6", "27"),
new Order("2", "28,30"), new Order("4", "29"),
new Order("8", "26"), //<-- added this for demo
new Order("5", "26"));
Map<String, String> map = orders.stream()
.flatMap(order -> Arrays
.stream(order.getExecutionId()
.split(","))
.map(a -> new String[] { a,
order.getOrderId() }))
.collect(Collectors.toMap(info -> info[0], info -> info[1],
(value, oId) -> value + "," + oId,
LinkedHashMap::new));
System.out.println(map);它打印了以下内容:
{23=2,21=2,25=2,22=4,24=4,27=6,
28=2,30=2,29=4,26=8,5}
注意最后一项。这是一个合并函数,以防您以相同的键结束不同的值。把他们连在一起。如果你没有这种情况,把它留在里面也不会引起问题。
下面是使用嵌套循环和map.merge方法的相同结果,后者也是Java8。
Map<String,String> map2 = new LinkedHashMap<>();
for (Order order : orders) {
for (String eId : order.getExecutionId().split(",")) {
map2.merge(eId, order.getOrderId(), (value,oId)-> value + "," + oId);
}
}
System.out.println(map2);https://stackoverflow.com/questions/60466566
复制相似问题