lambda - 从列表中提取数据使用 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 服务器
解决方案
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);
推荐阅读
- javascript - 动态选择选项和来自 php 的动态数据
- c# - 从 Azure Function ping 服务器
- python - 满足条件时通过不和谐机器人发送消息
- ruby - “class << self”块内的Ruby访问类
- c++ - 在调用函数上实现 C++ 转换
- python - 需要帮助在不使用 bin() 或 hex() 等函数的情况下将十进制转换为十六进制
- kubernetes - 对 Istio ServiceRoleBinding 用户感到困惑
- python - pip 未与 python 一起安装,它不会自行安装
- c# - 检查 UWP 中的用户货币符号
- python - 仅在通用换行符处拆分 Unicode 字符串(\n、\r、\r\n)