在两个列表上使用java流左连接

在两个列表上使用java流左连接,java,java-8,Java,Java 8,我有一个实体客户具有cid、cname和aid,另一个实体地址具有aid、city和state 我在两个不同的列表中获取了这两个实体的数据-列表和列表。我想要一个结果列表(customer和address上的左连接),它包含来自两个列表的数据,使用java流api或java 8的任何其他功能。此外,结果列表的类型应该是什么 有可能吗 请帮忙 提前谢谢 公共类客户{ private Integer cid; private String name; private Integer aid; //

我有一个实体客户具有cid、cname和aid,另一个实体地址具有aid、city和state

我在两个不同的列表中获取了这两个实体的数据-列表和列表。我想要一个结果列表(customer和address上的左连接),它包含来自两个列表的数据,使用java流api或java 8的任何其他功能。此外,结果列表的类型应该是什么

有可能吗

请帮忙

提前谢谢


公共类客户{

private Integer cid;
private String name;
private Integer aid;
// getters and setters
// tostring()
// constructors with and without params
公共课堂演讲{

private Integer aid;
private String city;
private String state;
private Integer pincode;
//getters and setters
//tostring()
//constructors with and without params
公共类客户添加到{

private Integer cid;
private String name;
private Integer aid;
private String city;
private String state;
private Integer pincode;
// getters and setters
// tostring()
// constructors with and without params
公共类DemoMain{

public static void main(String[] args) {

    List<Customers> customers = new ArrayList<Customers>();
    List<Address> addresses = new ArrayList<Address>();
    customers.add(new Customers(1, "abc1", 123));
    customers.add(new Customers(2, "abc2", 124));
    customers.add(new Customers(3, "abc3", 125));
    customers.add(new Customers(4, "abc4", 126));
    customers.add(new Customers(5, "abc5", 127));

    addresses.add(new Address(123, "bangalore", "karnataka", 101010));
    addresses.add(new Address(125, "chennai", "tamil nadu", 202020));
    addresses.add(new Address(127, "hyderabad", "telanagana", 303030));

    List<Cust_Add_DTO> mergerdleftjoin = customers.stream()
            .flatMap(x -> addresses.stream().filter(y -> x.getAid().equals(y.getAid())))
            .map(y -> new Cust_Add_DTO(x.getCid(), y.getAid(), y.getCity(), y.getPincode(), y.getState(),
                    x.getName()))
            .collect(Collectors.toList());
publicstaticvoidmain(字符串[]args){
列出客户=新建ArrayList();
列表地址=新的ArrayList();
新增(新客户(1,“abc1”,123));
新增(新客户(2,“abc2”,124));
添加(新客户(3,“abc3”,125));
添加(新客户(4,“abc4”,126));
添加(新客户(5,“abc5”,127));
地址.添加(新地址(123,“班加罗尔”,“卡纳塔克邦”,101010));
地址。添加(新地址(125,“钦奈”,“泰米尔纳德邦”,202020));
地址.添加(新地址(127,“海得拉巴”,“特拉纳加纳”,303030));
List mergerdleftjoin=customers.stream()
.flatMap(x->addresses.stream().filter(y->x.getAid().equals(y.getAid()))
.map(y->new Cust\u Add\u DTO(x.getCid(),y.getAid(),y.getCity(),y.getPincode(),y.getState(),
x、 getName())
.collect(Collectors.toList());

我可以看到DB中有两个实体的列表:

// @Entity
class Customers {

    private int cid;
    private String name;
    private int aid;
}

// @Entity
class Address {

    private int aid;
    private String city;
    private String state;
}
最好从DTO中拆分DAO层实体;因此您应该创建所需的DTO:

class CustomerDTO {

    private int cid;
    private String name;
    private AddressDTO address;
}

class AddressDTO {

    private int aid;
    private String city;
    private String state;
}
现在,您可以使用
Streams
编写
leftJoin
方法了:

public static List<CustomerDTO> leftJoin(List<Customers> customers, List<Address> addresses) {
    Map<Integer, Address> aidAddress = addresses.stream().collect(Collectors.toMap(Address::getAid, Function.identity()));

    return customers.stream()
                    .map(customer -> {
                        CustomerDTO customerDto = new CustomerDTO();
                        // set all fields from customer -> customerDto

                        Address address = aidAddress.get(customer.getAid());

                        if (address != null) {
                            AddressDTO addressDto = new AddressDTO();
                            // set all fields from address -> addressDto
                            customerDto.setAddress(addressDto);
                        }

                        return customerDto;
                    })
                    .collect(Collectors.toList());
}
公共静态列表leftJoin(列出客户、列出地址){
Map aiddress=addresses.stream().collect(Collectors.toMap(Address::getAid,Function.identity());
return customers.stream()
.map(客户->{
CustomerDTO CustomerDTO=新CustomerDTO();
//从customer->customerDto设置所有字段
Address=aiddress.get(customer.getAid());
if(地址!=null){
AddressDTO AddressDTO=新地址DTO();
//将所有字段从地址->地址设置为
customerDto.setAddress(addressDto);
}
退回客户;
})
.collect(Collectors.toList());
}

是的,您必须试一试。结果类型应该是您希望作为输出的内容。分享课程详细信息和您迄今为止尝试过的Naman所说的内容。请不要将代码作为图像发布。这会使搜索变得困难,而且人们无法将代码从您的问题复制到他们的答案。先生,假设对客户的一个帮助是与地址中的许多aid关联,并假设aid不是地址中的标识列,而是客户中的标识列。那么如何解决此问题。我在线程main中获得重复密钥作为异常。请提供任何解决方案。提前感谢。