Lambda 从列表中提取数据<;服务器>;使用Lamda表达式的用户列表
我有两个列表导入服务器列表,currServerList 我想用filter方法替换重复项 服务器POJOLambda 从列表中提取数据<;服务器>;使用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;
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指的是serverListList 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);