我有两个List<Server>
当前服务器和List<Server>
服务器列表,但是我想从服务器列表中已经存在的当前服务器中过滤掉服务器。
现在,基于其进行检查的唯一性是List<IPAddress>
,位于上述两个列表中。
IPAddress POJO具有两个字段String ipaddress, boolean primary
列表具有多个辅助ip,但是有一个唯一的主要ip,因此我们需要根据该主要ip进行过滤,并且我们只能检查布尔值是否为true才能知道其主要ip。
我认为这将使流过滤器逻辑变得非常复杂,因此我需要尝试的帮助,但我不是函数编程专家。
serverList.stream().filter(new Predicate<? extends Server>() {
})
错误:类型中的方法filter(Predicate) 流不适用于参数(新的Predicate(){})
服务器POJO的getter和setter与IPAddress相同。 List在此服务器POJO中作为获取器和设置器。
public class Server {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
public Integer id;
@OneToMany (mappedBy = "server",cascade = CascadeType.ALL, orphanRemoval = true)
private List<IPAddress> ipaddresses;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public void setIpaddresses(List<IPAddress> ipaddresses) {
this.ipaddresses = ipaddresses;
}
public List<IPAddress> getIpaddresses() {
return ipaddresses;
}
}
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;
}
}
答案 0 :(得分:1)
这实际上很简单。
首先,在Server中添加一个方法以获取其主地址:
public String getPrimaryIpAddress() {
return ipaddresses.stream()
.filter(IPAddress::isPrimary)
.findAny()
.orElseThrow(() -> new IllegalStateException("there should be a primary address")
.getIpaddress();
}
然后创建一组主要地址
List<Server> serverList = ...
Set<String> primaryIpAddresses = serverList.stream()
.map(Server::getPrimaryIpAddress)
.collect(Collectors.toSet());
然后过滤服务器列表:
List<Server> currrent = ...
List<Server> filtered = current.stream()
.filter(s -> !primaryIpAddresses.contains(s.getPrimaryIpAddress()))
.collect(Collectors.toList());