Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
外部连接两个列表以在Java中生成新列表_Java_List_Arraylist_Java Stream - Fatal编程技术网

外部连接两个列表以在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.S
Users
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());