使用 java 8 根据特定值将两个 pojo 列表组合成另一个 pojo 列表

combine two list of pojos into another list of pojo on the basis of specific value using java 8

我正在尝试使用 java 8

来增强我当前的代码

我有两个 pojo 列表

    class A{
    long id;
    String name;
    Sting age;
// getters setters
    }

    class B{
    long id;
    String address;
    String city;
// getters setters
    }

需要class:

    class C{
    long id;
    String name;
    Sting age;
    String address;
    String city;
// getters setters
    }

我有 list<A>List<B>,需要最后的 List<C>。我已经使用 for 循环和所有内容完成了这个。但我现在想简化使用 java 8 functionalitis.

非常感谢任何帮助。

编辑

 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<C> collect = aList.stream()
        .map(a -> {
            C obj = new C();
            obj.setId(a.getId());
            obj.setName(a.getName());
            obj.setAge(a.getAge());
            bList.stream()
                    .filter(b -> a.getId() == b.getId())
                    .findFirst()
                    .ifPresent(b -> {
                        obj.setAddress(b.getAddress());
                        obj.setCity(b.getCity());
                    });
            return 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());

我能想到的最干净的方法是使用 HashMap 而不是 List,然后使用 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());

Returns(我改了toString()):

[C{id=1234, name='foo', age='bar', address='test street', city='town'}]