使用Java8根据特定值将两个pojo列表合并到另一个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

我正在尝试使用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 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'}]