我想得到两个不同类型的List
的交集和并集。我一直在尝试使用Java 8流,因为我认为这是最简单的方法。到目前为止,我每次都失败了。
我简化了代码,因此可以轻松地复制它。我有两个对象,Data1
和Data2
。
例如:
public class Data2 {
private int id;
private String name;
private String type;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Data2(int id, String name, String type) {
this.id = id;
this.name = name;
this.type = type;
}
}
public class Data1 {
private int id;
private String name;
private int amount;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
public Data1(int id, String name, int amount) {
this.id = id;
this.name = name;
this.amount = amount;
}
}
public class OutputData {
private int id;
private String name;
private String type;
private int amount;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
public OutputData(int id, String name, String type, int amount) {
this.id = id;
this.name = name;
this.type = type;
this.amount = amount;
}
}
它们具有相似的字段。我需要根据ID(相交)将它们相交,并将它们存储在类型为OutputData
的输出中(联合?)。
主要类型的示例:
List<Data2> listOfData2 = new ArrayList<Data2>();
listOfData2.add(new Data2(10501, "JOE" , "Type1"));
listOfData2.add(new Data2(10603, "SAL" , "Type5"));
listOfData2.add(new Data2(40514, "PETER", "Type4"));
listOfData2.add(new Data2(59562, "JIM" , "Type2"));
listOfData2.add(new Data2(29415, "BOB" , "Type1"));
listOfData2.add(new Data2(61812, "JOE" , "Type9"));
listOfData2.add(new Data2(98432, "JOE" , "Type7"));
listOfData2.add(new Data2(62556, "JEFF" , "Type1"));
listOfData2.add(new Data2(10599, "TOM" , "Type4"));
List<Data1> listOfData1 = new ArrayList<Data1>();
listOfData1.add(new Data1(10501, "JOE" ,3000000));
listOfData1.add(new Data1(10603, "SAL" ,6225000));
listOfData1.add(new Data1(40514, "PETER" ,2005000));
listOfData1.add(new Data1(59562, "JIM" ,3000000));
listOfData1.add(new Data1(29415, "BOB" ,3000000));
这是我对此的最佳尝试之一,没有成功,也有很多错误:
List<OutputData> od =
listOfData1.stream()
.flatMap(x -> listOfData2.stream()
.filter(y -> x.getId().equals(y.getId()))
.map(y -> new OutputData(x.getId(), x.getName(), y.getType(), x.getAmount()))
.collect(Collectors.toList()));
这应该返回一个List<OutputData>
,其中有一个ID为10603的条目,名称为SAL,并且填充了所有其他字段。
应该这样做,但是在示例中,每个列表中有5条记录具有相同的ID。
List<OutputData> result = listOfData1.stream()
.flatMap(x -> listOfData2.stream()
.filter(y -> x.getId() == y.getId())
.map(y -> new OutputData(y.getId(), x.getName(), y.getType(), x.getAmount())))
.collect(Collectors.toList());
我给你一些伪代码:
declare list 3 (type data3)
for i = length of list 1
for j = length of list 2
if list1[i].getid == list2[j].getid
new data3 object with all relevant fields
add to list 3