<Server> 使用 Lamda 表达式从列表用户列表中提取数据



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

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

服务器波乔

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;
}

}

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

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

我正在检索具有服务器列表数据的新列表+从currServer列表中删除冗余数据

我试过这个东西

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服务器

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);

您的筛选器块不正确。 如果我正确理解您的问题(如@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);  

在你的问题中,你说的是服务器列表和currServerList。但是这些变量被命名为 currServerList & importServerList。这是相当令人困惑的。我相信导入服务器列表是指服务器列表

最新更新