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