外部连接两个列表以在Java中生成新列表
我试图找到一种方法,将两个具有两个唯一属性的对象列表连接起来,以生成一个新的对象列表 用户类外部连接两个列表以在Java中生成新列表,java,list,arraylist,java-stream,Java,List,Arraylist,Java Stream,我试图找到一种方法,将两个具有两个唯一属性的对象列表连接起来,以生成一个新的对象列表 用户类 public class Users { String id; String name; String gender; } public class Academics { String id; String name; String grade; String professional; } 在这里添加一些数据 List&l
public class Users {
String id;
String name;
String gender;
}
public class Academics {
String id;
String name;
String grade;
String professional;
}
在这里添加一些数据
List<Users> userList=new ArrayList<Users>();
userList.add(new Users("1","AA","Male"));
userList.add(new Users("2","BB","Male"));
userList.add(new Users("3","CC","Female"));
List<Academics> academicsList=new ArrayList<Academics>();
academicsList.add(new Academics("1","AA","A","Doctor"));
academicsList.add(new Academics("2","BB","B","Carpenter"));
academicsList.add(new Academics("3","CC","C","Engineer"));
在这里添加一些数据
List<Users> userList=new ArrayList<Users>();
userList.add(new Users("1","AA","Male"));
userList.add(new Users("2","BB","Male"));
userList.add(new Users("3","CC","Female"));
List<Academics> academicsList=new ArrayList<Academics>();
academicsList.add(new Academics("1","AA","A","Doctor"));
academicsList.add(new Academics("2","BB","B","Carpenter"));
academicsList.add(new Academics("3","CC","C","Engineer"));
在这里,我需要通过将UserList和acadersList与id
和name
这两个公共属性进行外部连接来计算列表
我确实需要作为一个批量操作来完成,而不是一个接一个地执行任何For/While循环
有什么方法可以达到这个目的吗
更新1:
这里的连接就像外部连接,一些id不会出现在学术界,但会出现在用户中。
在这种情况下,我们需要在档案列表中显示等级/专业的空值
提前感谢,
Jay将其中一个输入列表转换为映射是有意义的,以便快速关联第一个和第二个列表的条目
Map<String,Users> userByID = userList.stream().collect(Collectors.toMap(Users::getID,Function.identity));
你将两个不同类型的列表合并是什么意思?结果列表的类型是什么?或者你的意思是“查找所有同时也是学者的用户”吗?@sprinter他想将UserList和AcademicsList结合起来,形成我个人资料的结果列表。@saif ahmad:问题没有细节。你想要什么类型的加入?如果需要内部,则只有在两个输入列表中找到相同的id时,才会填充结果列表。但是如果您想要外部联接,那么如果仅在两个输入列表中的一个中找到id,您的列表也将被填充。这就改变了所有要使用的算法。所以短跑运动员的问题是恰当的。@Saifhamad我还是不明白<代码>配置文件有几个在其他类中不存在的字段。对于新创建的对象,这些字段的值是多少?@amanin:对不起,我错过了。我更新了问题。我需要在这里执行外部连接。您的回答非常有效,但我错过了问题中有关连接类型的信息。默认情况下,这对内部联接很好。但是我需要执行
外部联接
,其中配置文件
需要为中缺少的属性显示null。P.SUsers
class@Jayendran您可以做一个简单的更改—从第二个列表(acadersList)创建一个映射,并在第一个列表(userList)上进行流式处理。在流管道中,创建配置文件,即使在地图中找不到学术实例。你搞定了,伙计!它工作得很好。只有一个问题。您单独使用了Id
作为标识。但实际数据具有结合id
和name
的唯一性。是否有办法将名称
包含为业务密钥。@Jayendran您可以连接ID和名称,并将其用作映射的密钥。编写u->u.getID()+u.getName()
,而不是Users::getID
。然后将acadersbyid.get(u.getID())
更改为acadersbyid.get(u.getID()+u.getName())代码>
Map<String,Academics> academicsByID = userList.stream().collect(Collectors.toMap(Academics::getID,Function.identity));
List<Profile> profiles =
userList.stream()
.map(u -> {
Profile p = new Profile ();
Academics a = academicsByID.get(u.getID());
// now set all the Profile fields based on the properties
// of the Users instance (u) and the Academics instance (a)
// (if available)
return p;
})
.collect(Collectors.toList());