Lambda 从列表中提取数据<;服务器>;使用Lamda表达式的用户列表

Lambda 从列表中提取数据<;服务器>;使用Lamda表达式的用户列表,lambda,java-8,functional-programming,Lambda,Java 8,Functional Programming,我有两个列表导入服务器列表,currServerList 我想用filter方法替换重复项 服务器POJO public class Server { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="ID") public Integer id; @Column(name="serverName") private String serverName;

我有两个列表导入服务器列表,currServerList

我想用filter方法替换重复项

服务器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();
    }

}
此处主IP地址对于每台服务器都是唯一的

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

我正在检索具有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()); 
Set primaryPaddress=currServerList.stream()
.map(服务器::GetPrimaryPaddress)
.collect(收集器.toSet());
List filteredList=importServerList.stream()
.filter(s->PrimaryPaddress.contains(s.GetPrimaryPaddress())?s:currlistserverObject)
.collect(Collectors.toList());
我想它可能工作正常,但不知道在
s:currlistserverObject


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

您的筛选块不正确。如果我正确理解了你的问题(正如@Eugene提到的,这个问题并不那么清楚),这就是你需要的

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

filteredList.addAll(currServerList);  
Set primaryPaddress=currServerList.stream()
.map(服务器::GetPrimaryPaddress)
.collect(收集器.toSet());
List filteredList=importServerList.stream()
.filter(!s->PrimaryPaddress.contains(s.GetPrimaryPaddress()))
.collect(Collectors.toList());
filteredList.addAll(currServerList);
在你的问题中,你提到了serverList和currServerList。但是变量名为currServerList&importServerList。这很令人困惑。我相信importServerList指的是serverList

List newList=new ArrayList(importServerList);
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);
Set primary=importServerList.stream() .map(服务器::GetPrimaryPaddress) .collect(收集器.toSet()); Set temp=currServerList .stream() .filter(server->!primary.contains(server.getPrimaryPaddress())) .collect(收集器.toSet()); newList.addAll(临时);
您能简化这个问题吗?无法告诉您想要做什么或实现什么如上所述,我有两个列表,但如果serverList的ip地址与currServerList的ip地址相同,则从筛选列表或新列表中的serverList获取服务器,该列表也是类型列表,因此我们必须从这两个列表中收集服务器列表,但如果两个列表中的主ip相同,则从serverList获取服务器你刚才自己写的,我看了三遍,还是很难理解,对不起。这里可能是我,不知道它像serverList中的服务器a、b、c和currServerList中的服务器d、e、f检查serverList的主ip地址是否与currServerList的主地址匹配,然后从serverList返回服务器,否则添加全部。这就像一个联合体,但只有在存在相等的联合体时才从serverList中添加server@Eugene很抱歉让它变得复杂,尽管我在上面问了什么,我编辑的PankajSinghal的答案对我有用是的,它可能与变量混淆了…..如果将所有代码与currServerList和importServerList进行交换。。我想这会很好,因为我不希望所有的currServerList都导入ServerList…..整个操作是将数据库中的重复的currServerList替换为新的服务器,即importServerList。这是服务器updatePerfect中的一个覆盖操作。这是我刚才说的,与list交换将起作用,但您做了一点错误,使用newList删除临时文件,并且不将其视为设置而不是Listno<代码>新列表包含所有
导入服务器列表
。您需要在
newList
中添加temp,以便保留
importServerList
中的数据,请在您的答案中查看我的更新,并指出其中的错误?我已经在第一行添加了importServerList。请参见
List newList=newarraylist(导入服务器列表)但请告诉我我编辑您的答案时出了什么问题请看我在currServerList流中删除了currServerList中常见的所有importServerList服务器,然后我最后添加了整个serverList
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);