首页 > 解决方案 > 从列表中提取数据使用 Lamda 表达式的 userList

问题描述

我有两个 List importServerList,currServerList

我想使用过滤器方法替换重复项。

服务器 POJO

public class Server {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="ID")
    public Integer id;

    @Column(name="serverName")
    private String serverName;      

    @OneToMany (mappedBy = "server",cascade = CascadeType.ALL, orphanRemoval = true)
    //@OneToMany(fetch=FetchType.EAGER,cascade = CascadeType.REMOVE, orphanRemoval = true)
    //@JoinColumn(name="server_id", referencedColumnName="ID")
    private List<IPAddress> ipaddresses;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getServerName() {
    return serverName;
    }

    public void setServerName(String serverName) {
    this.serverName = serverName;
    }
    public void setIpaddresses(List<IPAddress> ipaddresses) {
        this.ipaddresses = ipaddresses;
    }

    public List<IPAddress> getIpaddresses() {
        return ipaddresses;
    }

    public String getPrimaryIpAddress() {
        return ipaddresses.stream()
            .filter(IPAddress::isPrimary)
            .findAny()
            .orElseThrow(() -> new IllegalStateException("there should be a primary address"))
            .getIpaddress();
    }

}

这是我的 IPAddress POJO

public class IPAddress {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="ID")
    public Integer id;

    @Column(name="ipaddress")
    private String ipaddress;

    @Column(name="primaryIP")
    private boolean primary;

    @ManyToOne
    @JsonIgnore
    @JoinColumn(name = "server_id")
    private Server server;


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getIpaddress() {
        return ipaddress;
    }

    public void setIpaddress(String ipaddress) {
        this.ipaddress = ipaddress;
    }

    public boolean isPrimary() {
        return primary;
    }

    public void setPrimary(boolean primary) {
        this.primary = primary;
    }

    public Server getServer() {
        return server;
    }

    public void setServer(Server server) {
        this.server = server;
    }


}

这里的主 ipaddress对于每台服务器都是唯一的

现在我想要一个没有突变或更改原始列表中的数据的列表,因此使用功能方法。

我正在检索具有 serverList 数据的新列表 + 从 currServerList 中删除冗余数据

我试过这个东西

Set<String> primaryIpAddresses = currServerList.stream()
                    .map(Server::getPrimaryIpAddress)
                    .collect(Collectors.toSet());
            List<Server> filteredList=importServerList.stream()
                    .filter(s->primaryIpAddresses.contains(s.getPrimaryIpAddress())?s:currlistserverObject)
                    .collect(Collectors.toList()); 

我想它可能会正常工作,但不知道要添加什么s:currlistserverObject

目标:获取包含 importServerList 和 currServerList 的所有服务器的新列表,但如果两者中存在冲突或相同的 IP 地址,则从 importServerList 更新服务器,因为服务器名称可能不同,所以我想在新列表中更新 importServerList 服务器

标签: lambdajava-8functional-programming

解决方案


List<Server> newList = new ArrayList<>(importServerList);

Set<String> primary = importServerList.stream()
        .map(Server::getPrimaryIpAddress)
        .collect(Collectors.toSet());

Set<Server> temp = currServerList
        .stream()
        .filter(server -> !primary.contains(server.getPrimaryIpAddress()))
        .collect(Collectors.toSet());

newList.addAll(temp);

推荐阅读