按索引将数组中的元素分组到 List<Map<String,Object>>

Grouping elements from arrays by index into List<Map<String,Object>>

我有一个 Map,其中键是数组的名称对象标识符,也就是集合名称及其对应的对象数组。

objective 是为了能够将 Object [] 的不同条目合并到一个 List> 中,其中每个 Map 的键对应于已知的 Collection 名称和Object是每个数组的第i个值。

为了更清楚地说明这一点:

假设我们有一个具有以下数组的 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());