使用Java8根据特定值将两个pojo列表合并到另一个pojo列表中
我正在尝试使用Java8增强我当前的代码 我有两份POJO的清单使用Java8根据特定值将两个pojo列表合并到另一个pojo列表中,java,list,arraylist,java-8,pojo,Java,List,Arraylist,Java 8,Pojo,我正在尝试使用Java8增强我当前的代码 我有两份POJO的清单 class A{ long id; String name; Sting age; // getters setters } class B{ long id; String address; String city; // getters setters } 必修课: class C{ long id; String na
class A{
long id;
String name;
Sting age;
// getters setters
}
class B{
long id;
String address;
String city;
// getters setters
}
必修课:
class C{
long id;
String name;
Sting age;
String address;
String city;
// getters setters
}
我有列表
和列表
,需要最终的列表
。我已经完成了这个使用for循环和一切。但我现在想简化Java8的使用
非常感谢您的帮助
编辑
List<C> cList=new ArrayList<>();
C obj=new C();
for(A aa: aList){
C obj=new C();
obj.setId(a.getId);
obj.setName(a.getName);
obj.setAge(a.getAge);
for(B bb: bList){
if(aa.getId==bb.getId(){
obj.setAddress(bb.setAddress);
obj.setCity(bb.setCity);
}
}
cList.add(obj);
}
List cList=new ArrayList();
C obj=新的C();
(aa:aList){
C obj=新的C();
对象setId(a.getId);
obj.setName(a.getName);
对象设置(a.设置);
对于(bb:bList){
如果(aa.getId==bb.getId(){
对象设置地址(bb.setAddress);
目标设定城市(bb设定城市);
}
}
cList.add(obj);
}
如果您只想将代码传输到流,您可以:
List collect=aList.stream()
.地图(a->{
C obj=新的C();
obj.setId(a.getId());
obj.setName(a.getName());
对象设置(a.getAge());
bList.stream()
.filter(b->a.getId()==b.getId())
.findFirst()
.如果存在(b->{
obj.setAddress(b.getAddress());
obj.setCity(b.getCity());
});
返回obj;
}).collect(toList());
但最好为bList
引入map,并将其用作后者的查找
Map<Long, B> map = bList.stream()
.collect(Collectors.toMap(B::getId, b -> b));
List<C> collect = aList.stream()
.map(a -> {
C obj = new C();
obj.setId(a.getId());
obj.setName(a.getName());
obj.setAge(a.getAge());
if (map.containsKey(a.getId())) {
B b = map.get(a.getId());
obj.setAddress(b.getAddress());
obj.setCity(b.getCity());
}
return obj;
}).collect(toList());
Map Map=bList.stream()
.collect(Collectors.toMap(B::getId,B->B));
List collect=aList.stream()
.地图(a->{
C obj=新的C();
obj.setId(a.getId());
obj.setName(a.getName());
对象设置(a.getAge());
if(map.containsKey(a.getId())){
B=map.get(a.getId());
obj.setAddress(b.getAddress());
obj.setCity(b.getCity());
}
返回obj;
}).collect(toList());
我能想到的最干净的方法是使用HashMap
而不是列表
,然后使用Id
作为键,实际对象作为值,这样可以更容易地查找。还可以为C
生成完整的构造函数:
A a1 = new A(1234, "foo", "bar");
A a2 = new A(12347, "baz", "quux");
B b1 = new B(2345, "example street", "city");
B b2 = new B(1234, "test street", "town");
HashMap<Long, A> aHashMap = new HashMap<Long, A>();
HashMap<Long, B> bHashMap = new HashMap<Long, B>();
aHashMap.put(a1.getId(), a1);
aHashMap.put(a2.getId(), a2);
bHashMap.put(b1.getId(), b1);
bHashMap.put(b2.getId(), b2);
List<C> cList = aHashMap.entrySet().stream()
.filter(entry->bHashMap.containsKey(entry.getKey()))
.map(entry -> {
B matchingB = bHashMap.get(entry.getKey());
return new C(entry.getKey(),
entry.getValue().getName(),
entry.getValue().getAge(),
matchingB.getAddress(),
matchingB.getCity());
})
.collect(Collectors.toList());
System.out.println(cList.toString());
您能分享一下您的循环吗?这样我们就可以帮助您将其转换成与Java 8兼容的东西吗?@ShanS我已经为这个案例添加了我的现有代码感谢您的回复,在提到的解决方案中,当我从jdbcTemplate.query(String,rowMapper)获取列表时,我必须添加额外的代码才能将列表转换成hashmap,但我确实可以尝试一下,你可以使用lczapski回答中提到的
Map=bList.stream().collect(Collectors.toMap(B::getId,B->B));
片段来获取地图。
[C{id=1234, name='foo', age='bar', address='test street', city='town'}]