使用List <server>中的Server对象的功能编程进行流和筛选

时间:2018-08-16 05:37:14

标签: java-8 functional-programming

我有两个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;
    }


}

1 个答案:

答案 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());