如何将对象数组转换为映射数组并删除映射中的键?

How to cast Object Array to Map Array and remove key in the Map?

我是 Java 的新手,我从 API 得到了一个 Object Array,如下所示。

实际上,列表中的每个 Object 都是一个 Map

我想删除每个 Map 中的 之一。

以下是我尝试过的方法,但无法解决问题:

remove() is not defined for object 

这样做的合适方法是什么?

Object Array:
List<Object> fruit: [{apple=3, orange=4}, {apple=13, orange=2}, {apple=1, orange=8}]

Code I tried:
List<Object> newList = fruit.stream().filter(x->x.getKey().equals("orange")).collect(Collectors.toList());

And

List<Object> newList = fruit.forEach(x->{
                                     x.remove();
                                     }););

Remark:
API Resp: [{country=US, fields={apple=3, orange=4},{country=CAD, fields={apple=1, orange=4}]
List<Object> fruit= apiResult.stream()
                             .map(x->x.get("fields"))            
                             .collect(Collectors.toList());

这将从地图中删除橙子:

fruit.forEach(x -> ((Map<?,?>) x).remove("orange"));

(您想创建一个 new 列表,其中包含删除了橙子的 new 地图,这更复杂。但事实并非如此你的尝试似乎正在做。)

您在所有尝试中遗漏的一件事是您需要将列表 elements 转换为 Map.

但更简洁的解决方案是将 List<Object> fruit 定义为 List<Map<String, Integer>> fruit


在你问的问题标题中:

How to cast Object Array to Map Array and remove key in the Map?

简短的回答是你不能。已创建为 Object[] 的数组 object 无法转换为 Map<?, ?>[]。但如您所见,您不需要这样做来解决您的问题。

How to cast Object Array to Map Array

您似乎混淆了 数组 ArrayList.

一个数组是一个data-container,它占据一个连续的内存块,并且有一个固定的长度。

ArrayListDynamic array 数据结构的 built-in 实现,它由数组支持,但与普通数组相反,它能够增长大小并提供很多有用的行为。

如果你的背景是 JavaScript,那么 ArrayList 更接近 JavaScript 中的数组。

关于转换,正如我所说,您首先不应使用 Object。您的列表应该是 List<Map<String, Integer>> 类型,那么就没有问题。

如果我们尝试将此列表对象转换为其实际类型 - 运气不好:

List<Map<String, Integer>> fruitConverted = (List<Map<String, Integer>>) fruit; // that would not compile, the compiler will not allow that

通过使用 so-called 行类型 .

的中间变量来绕过编译器
List rowList = fruit; 
        
List<Map<String, Integer>> fruitConverted = rowList;

在这种情况下,编译器会发出警告,但代码会编译。但是你应该意识到编码的各种糟糕陈旧。

有关类型转换的详细信息see

I would like to remove one of the key in each dictionary

在您的代码中,您试图以不同的方式创建一个新列表,因此您似乎希望保留所有地图完好无损的先前版本的列表.

如果是这样,您可以使用流为每个映射创建每个条目的副本(不包括具有不需要的键 "orange" 的条目),然后收集到列表中。

public static void main(String[] args) {
    List<Object> fruit =
        List.of(Map.of("apple", 3, "orange", 4),
                Map.of("apple", 13, "orange", 2),
                Map.of("apple", 1, "orange", 8));

    List<Map<String, Integer>> newList = fruit.stream()
        .map(map -> ((Map<String, Integer>) map).entrySet().stream()
            .filter(entry -> !entry.getKey().equals("orange")) // will retain entries with key that not equal to "orange"
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)))
        .collect(Collectors.toList());

    System.out.println(newList);
}

输出:

[{apple=3}, {apple=13}, {apple=1}]

但是如果你不需要以前版本的列表,那么你可以使用 forEach()remove().

的组合