如何为相同的键迭代 2 个哈希图并将键和两个值添加到对象
How to iterate over 2 hashmap for same key and add key and both values to object
我正在学习集合,我想使用流循环遍历 2 HashMap
并将键和两个值添加到 List
对象。
例如:
HashMap<String, String> map1= new LinkedHashMap<String, String>();
HashMap<String, String> map2= new LinkedHashMap<String, String>();
map1.put("A", "Apple");
map1.put("B", "Ball");
map1.put("C", "Cucumber");
map1.put("D", "Dairy");
map2.put("A", "Airplane");
map2.put("B", "Baby");
map2.put("C", "Cat");
map2.put("D", "Dog");
class DummyClass {
String Key;
String Value1;
String Value2;
// getters and setters..
}
List<DummyClass> test = Add key, and both Values
输出预期 :
DummayClass Obj1 = {A,Apple,Airplane};
DummayClass Obj2 = {B,Ball,Baby}; likewise
我可以通过迭代单个映射并比较键并添加它来实现这一点。但我想使用 Streams
.
来达到同样的效果
遍历 map1
的条目集。流操作很好。对于每个条目,检查密钥是否也在 map2
中(使用流的 filter
方法)。如果是,则从键和两个映射中的值创建一个 DummyClass
对象。
PS 同样在您的 DummyClass
中尊重 Java 命名约定。实例变量名称以小写字母开头,因此 key
、value1
和 value2
。还为 class.
编写一个构造函数
教程 link:Iterate over a Map in Java | Baeldung(包含关于使用 Stream 的部分 API)
文档 links:
Map.entrySet()
Map.Entry.getKey()
Map.containsKey()
Map.get()
定义一个记录来保存结果。
record Combo ( String k , String x , String y ) {}
制作第一张地图中条目的流。从每个条目中提取键和值。将它们传递给我们的组合 class 的构造函数,以及第三个参数,该参数是通过第一个映射的键访问的第二个映射的值。
这里有一些未经测试的代码可以尝试。
List< Combo } combos = mapX.entrySet().stream().map( entry -> new Combo( entry.getKey() , entry.getValue() , mapY.get( entry.getKey() ) ) ).toList() ;
我不知道有什么方法可以同时迭代两个 HashMap,但你可以这样做:
List<DummyClass> objects =
map1.entrySet().stream().map(object -> {
return new DummyClass(object.getKey(), object.getValue(), map2.get(object.getKey()));
}).collect(Collectors.toList());
这会将所有键值对从 map1 映射到 DummyClass 的新实例,同时从 map2 中选取具有相同键的值。
作为奥莱 V.V。正确地说你应该添加一个检查以查看 map1 中的密钥是否实际上是 map2 中的有效密钥。
请注意,您必须向 DummyClass 添加一个构造函数,此代码才能正常工作。
我正在学习集合,我想使用流循环遍历 2 HashMap
并将键和两个值添加到 List
对象。
例如:
HashMap<String, String> map1= new LinkedHashMap<String, String>();
HashMap<String, String> map2= new LinkedHashMap<String, String>();
map1.put("A", "Apple");
map1.put("B", "Ball");
map1.put("C", "Cucumber");
map1.put("D", "Dairy");
map2.put("A", "Airplane");
map2.put("B", "Baby");
map2.put("C", "Cat");
map2.put("D", "Dog");
class DummyClass {
String Key;
String Value1;
String Value2;
// getters and setters..
}
List<DummyClass> test = Add key, and both Values
输出预期 :
DummayClass Obj1 = {A,Apple,Airplane};
DummayClass Obj2 = {B,Ball,Baby}; likewise
我可以通过迭代单个映射并比较键并添加它来实现这一点。但我想使用 Streams
.
遍历 map1
的条目集。流操作很好。对于每个条目,检查密钥是否也在 map2
中(使用流的 filter
方法)。如果是,则从键和两个映射中的值创建一个 DummyClass
对象。
PS 同样在您的 DummyClass
中尊重 Java 命名约定。实例变量名称以小写字母开头,因此 key
、value1
和 value2
。还为 class.
教程 link:Iterate over a Map in Java | Baeldung(包含关于使用 Stream 的部分 API)
文档 links:
Map.entrySet()
Map.Entry.getKey()
Map.containsKey()
Map.get()
定义一个记录来保存结果。
record Combo ( String k , String x , String y ) {}
制作第一张地图中条目的流。从每个条目中提取键和值。将它们传递给我们的组合 class 的构造函数,以及第三个参数,该参数是通过第一个映射的键访问的第二个映射的值。
这里有一些未经测试的代码可以尝试。
List< Combo } combos = mapX.entrySet().stream().map( entry -> new Combo( entry.getKey() , entry.getValue() , mapY.get( entry.getKey() ) ) ).toList() ;
我不知道有什么方法可以同时迭代两个 HashMap,但你可以这样做:
List<DummyClass> objects =
map1.entrySet().stream().map(object -> {
return new DummyClass(object.getKey(), object.getValue(), map2.get(object.getKey()));
}).collect(Collectors.toList());
这会将所有键值对从 map1 映射到 DummyClass 的新实例,同时从 map2 中选取具有相同键的值。 作为奥莱 V.V。正确地说你应该添加一个检查以查看 map1 中的密钥是否实际上是 map2 中的有效密钥。
请注意,您必须向 DummyClass 添加一个构造函数,此代码才能正常工作。