объединить два списка pojo в другой список pojo на основе указанного c значения, используя java 8 - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь улучшить свой текущий код, используя java 8

У меня есть два списка pojos

    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
    }

i есть list<A> и List<B>, и требуется окончательный List<C>. Я завершил это, используя циклы for и все такое. но теперь я хочу упростить использование java 8 функционалита.

Любая помощь очень ценится.

EDIT

 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); 
    }

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Самый чистый способ, который я могу придумать, - использовать 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'}]
0 голосов
/ 13 июля 2020

, если вы хотите просто перенести свой код в потоки, вы можете:

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<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());
...