如何将对象数组转换为映射数组并删除映射中的键?
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,它占据一个连续的内存块,并且有一个固定的长度。
ArrayList
是 Dynamic 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()
.
的组合
我是 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,它占据一个连续的内存块,并且有一个固定的长度。
ArrayList
是 Dynamic 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()
.