按索引将数组中的元素分组到 List<Map<String,Object>>
Grouping elements from arrays by index into List<Map<String,Object>>
我有一个 Map,其中键是数组的名称对象标识符,也就是集合名称及其对应的对象数组。
objective 是为了能够将 Object [] 的不同条目合并到一个 List
为了更清楚地说明这一点:
假设我们有一个具有以下数组的 Map。
Map<String, Object[]> map = new HasMap<>();
Object[] ints = Stream.of(1,2,3,4,5).toArray();
Object[] dobules = Stream.of(1.0,2.0,3.0,4.0,5.0).toArray();
Object[] strings = Stream.of("a","b","c","d","e").toArray();
map.put("ints", ints);
map.put("doubles", dobules);
map.put("strings", strings);
那么这个条目的输出应该是这样的:
List
{"ints": 1, "doubles":1.0, "strings":"a"},
{"ints": 2, "doubles":2.0, "strings":"b"},
{"ints": 3, "doubles":3.0, "strings":"c"},
{"ints": 4, "doubles":4.0, "strings":"d"},
{"ints": 5, "doubles":5.0, "strings":"e"}
我正在寻找使用 java 集合流的解决方案
非常感谢
普通的旧方法:
List<Map<String, Object>> result = new ArrayList<>();
if(!map.isEmpty())
// Assume all the array lengths are the same
int length = map.values().iterator().next().length;
for(int i = 0; i < length; i++) {
Map<String, Object> row = new HashMap<>();
for(Map.Entry<String, Object[]> entry : map.entrySet()) {
row.put(entry.getKey(), entry.getValue()[i];
}
result.add(row);
}
}
混合方法:
int length = map.values().iterator().next().length;
for(int i = 0; i < length; i++) {
final int index = i; // make compiler happy
result.add(map.entrySet()
.stream()
.collect(toMap(Map.Entry::getKey, e -> e.getValue()[index])));
}
纯函数方法:
int length = map.isEmpty() ? 0 : map.values().iterator().next().length;
List<Map<String, Object>> result =
IntStream.range(0, length)
.boxed()
.map(i -> map.entrySet()
.stream()
.collect(toMap(Map.Entry::getKey, e -> e.getValue()[i])))
.collect(toList());
我有一个 Map
objective 是为了能够将 Object [] 的不同条目合并到一个 List
为了更清楚地说明这一点:
假设我们有一个具有以下数组的 Map
Map<String, Object[]> map = new HasMap<>();
Object[] ints = Stream.of(1,2,3,4,5).toArray();
Object[] dobules = Stream.of(1.0,2.0,3.0,4.0,5.0).toArray();
Object[] strings = Stream.of("a","b","c","d","e").toArray();
map.put("ints", ints);
map.put("doubles", dobules);
map.put("strings", strings);
那么这个条目的输出应该是这样的:
List
{"ints": 1, "doubles":1.0, "strings":"a"},
{"ints": 2, "doubles":2.0, "strings":"b"},
{"ints": 3, "doubles":3.0, "strings":"c"},
{"ints": 4, "doubles":4.0, "strings":"d"},
{"ints": 5, "doubles":5.0, "strings":"e"}
我正在寻找使用 java 集合流的解决方案 非常感谢
普通的旧方法:
List<Map<String, Object>> result = new ArrayList<>();
if(!map.isEmpty())
// Assume all the array lengths are the same
int length = map.values().iterator().next().length;
for(int i = 0; i < length; i++) {
Map<String, Object> row = new HashMap<>();
for(Map.Entry<String, Object[]> entry : map.entrySet()) {
row.put(entry.getKey(), entry.getValue()[i];
}
result.add(row);
}
}
混合方法:
int length = map.values().iterator().next().length;
for(int i = 0; i < length; i++) {
final int index = i; // make compiler happy
result.add(map.entrySet()
.stream()
.collect(toMap(Map.Entry::getKey, e -> e.getValue()[index])));
}
纯函数方法:
int length = map.isEmpty() ? 0 : map.values().iterator().next().length;
List<Map<String, Object>> result =
IntStream.range(0, length)
.boxed()
.map(i -> map.entrySet()
.stream()
.collect(toMap(Map.Entry::getKey, e -> e.getValue()[i])))
.collect(toList());